如果我将2D数组定义为:
char *tablechar[][2] = {
{"0", "Innova"},
{"2", "Brio" },
{"3", "Alto" },
{"4", "Bolero"},
{"5", "Swift" }
};
和代码在同一个文件中:
printf("Value = %d\n",sizeof(tablechar));
printf("Value = %d\n",sizeof(tablechar[0]));
printf("Num of rows = %d\n",sizeof(tablechar)/sizeof(tablechar[0]));
输出符合预期:
Value = 40
Value = 8
Num of rows = 5
现在,我将这个2D矩阵传递给一个定义为:
的函数void printstuff(char *tab[][2])
{
printf("Value = %d\n",sizeof(tab));
printf("Value = %d\n",sizeof(tab[0]));
printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0]));
}
我得到以下输出:
Value = 4
Value = 8
Num of rows = 0
在上面的函数中带有编译器警告:
为什么sizeof(tab)和sizeof(tablechar)的值不同?
答案 0 :(得分:4)
tablechar
是一个实际数组,但参数tab
将被视为指向具有指定类型的数组元素的指针,因此sizeof(tab)
将是指针的大小而sizeof(tablechar)
1}}将是数组的大小。
顺便说一下,将具有错误类型的数据传递给printf()
会调用未定义的行为。您必须使用%zu
代替%d
来打印size_t
运营商将评估的sizeof
。
答案 1 :(得分:2)
tablechar
是char
指针数组的数组,而函数参数tab
是指向2 char
指针数组的指针。
void printstuff(char *tab[][2])
相当于
void printstuff(char *(*tab)[2])
sizeof(tab)
会指定指针的大小而不是数组tablechar
。在C中,有一种方法可以将数组传递给函数。当您将数组传递给函数时,然后根据C规则数组衰减到指向其第一个元素的指针
永远记住数组不是指针。
答案 2 :(得分:1)
有:
char *tablechar[][2] = {
{"0", "Innova"},
{"2", "Brio" },
{"3", "Alto" },
{"4", "Bolero"},
{"5", "Swift" }
};
tablechar
的类型是一个包含five
个元素的数组,每个元素的类型为char* [2]
。所以sizeof(tablechar) = 5 * sizeof(char* [2]) = 5 * 8 = 5 * 4 * 2
。
tablechar[0]
的类型为char* [2]
,sizeof(tablechar[0]) = sizeof(char*) * 2 = 4 * 2 = 8
。
的
void printstuff(char *tab[][2])
{
printf("Value = %d\n",sizeof(tab));
printf("Value = %d\n",sizeof(tab[0]));
printf("Num of rows = %d\n",sizeof(tab)/sizeof(tab[0]));
}
tab
的类型为char**
,因此sizeof(tab) = 4
。
tab[0]
的类型为char* [2]
,因此sizeof(tab[0]) = 8
。