C语言中结构体数组传参后打印仅输出地址的问题排查
解决结构体数组打印只输出地址的问题
嘿,我一眼就看到问题所在啦!你遇到的打印地址而非实际值的情况,核心原因是结构体Date的成员定义出错了,咱们一步步来解决:
问题根源分析
你定义的Date结构体里,day和month被声明成了数组类型:
struct Date { char week_day[30]; int day[31]; // 这里是数组,不是单个日期值 int month[12]; // 同样是数组,不是单个月份值 };
当你在printf里写hol[i].date.day时,数组名会自动退化为指向数组首元素的指针,所以打印出来的就是内存地址,而非你想要的具体日期数值。
另外你的printf语句还有语法错误(末尾的...),格式符和参数的对应关系也需要调整。
修正方案
1. 修正结构体定义
把Date里的day和month改成单个整数类型——毕竟一个假期的日期是具体的某一天、某个月,不需要用数组存储:
struct Date { char week_day[30]; int day; // 单个整数存储日期 int month; // 单个整数存储月份 }; struct Holiday { char name[80]; struct Date date; };
2. 修正打印函数
调整printf的格式字符串,确保每个格式符对应正确的参数,同时补全语法;另外我额外加了一个count参数,用来指定要打印的假期数量,避免硬编码i<2,让函数更通用:
void printHols(struct Holiday hol[], int count) { printf("Holidays in 2018\n"); for (int i = 0; i < count; i++) { // 格式符和参数一一对应:%d对应int,%s对应字符串 printf("%d / %d \t - %s \t - %s\n", hol[i].date.day, hol[i].date.month, hol[i].date.week_day, hol[i].name); } }
3. 完整可运行测试代码
下面是包含结构体初始化和函数调用的完整代码,直接就能运行:
#include <stdio.h> struct Date { char week_day[30]; int day; int month; }; struct Holiday { char name[80]; struct Date date; }; void printHols(struct Holiday hol[], int count) { printf("Holidays in 2018\n"); for (int i = 0; i < count; i++) { printf("%d / %d \t - %s \t - %s\n", hol[i].date.day, hol[i].date.month, hol[i].date.week_day, hol[i].name); } } int main() { // 初始化两个假期数据 struct Holiday holidays[] = { { "New Year's Day", {"Monday", 1, 1} }, { "Christmas Day", {"Tuesday", 25, 12} } }; // 调用打印函数,传递数组和元素数量 printHols(holidays, 2); return 0; }
运行效果
执行这段代码后,你会得到正常的输出:
Holidays in 2018 1 / 1 - Monday - New Year's Day 25 / 12 - Tuesday - Christmas Day
内容的提问来源于stack exchange,提问作者Ndong Akwo
相关产品推荐
相关产品推荐

