2016-03-08 53 views
1

如果我定义的2D阵列如:sizeof运算

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 

与编译器警告在上面的功能:

compiler_warning

为什么会这样认为的sizeof的值(标签)和sizeof(tablechar)不同?

+1

4是指针的大小。 –

+1

[如何找到'sizeof'(一个指向数组的指针)]]的可能的副本(http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to -an-array) –

+1

[C编程语言中数组的大小?](https://stackoverflow.com/questions/1975128/sizeof-an-array-in-the-c-programming-language?) – kaylum

回答

4

tablechar是一个实际的阵列,但参数tab将被视为一个指向具有特定类型的阵列元素,所以sizeof(tab)将指针的大小而sizeof(tablechar)将所述阵列的大小。

顺便说一下,将具有错误类型的数据传递到printf()调用未定义的行为。您将不得不使用%zu而不是%d来打印size_t,运营商将对其进行评估。

+0

明白了, 谢谢! –

+0

有没有什么办法可以将二维数组的形式参数放入一个可以破译为数组本身而不是指针的函数中? –

2

tablecharchar指针数组的阵列,而函数参数tab是指向数组指针的指针。

void printstuff(char *tab[][2]) 

相当于

void printstuff(char *(*tab)[2]) 

sizeof(tab)会给指针不是数组tablechar的大小。在C中,有一种方法可以将数组传递给函数。当你将一个数组传递给一个函数时,然后按照C规则数组衰减来指向它的第一个元素。
请务必记住数组不是指针

+0

明白了,谢谢! –

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])); 
} 

类型的tabchar**,所以sizeof(tab) = 4tab[0]的类型是char* [2],所以sizeof(tab[0]) = 8

+0

明白了,谢谢! –