我试图获得多维数组的大小,并在C中编写代码,如下所示。
#include <stdio.h>
char b[3][4];
int main(void){
printf("Size of array b[3]=%d\n", sizeof(b[3]));
printf("Size of array b[2]=%d\n", sizeof(b[2]));
printf("Size of array b[5]=%d\n", sizeof(b[5]));
return 0;
}
在以上三个打印语句中,我的大小等于4.有人可以解释sizeof
在多维数组的情况下如何工作吗?为什么第三次打印的输出相同?
答案 0 :(得分:8)
b
是行3
和列4
的二维字符数组。
因此,如果您选择sizeof(b)
,您将获得12
。
b[0]
(和b[i]
一般)有一种大小为4
的1D字符数组。所以。如果你选择sizeof (b[0])
,你将获得4
。
b[0][0]
(一般b[i][j]
)的类型为char
。因此,如果您选择sizeof (b[0][0])
,您将获得1
。
sizeof
不依赖于数组索引。即使对于b[0]
和b[100]
,类型仍然保持不变,即使它可能超出了数组的内存范围。
答案 1 :(得分:0)
sizeof
运算符仅对该类型进行操作。
b
的类型是由三个元素组成的数组,这些元素是四个字符的数组:char[3][4]
。
现在,数组下标运算符b[n]
被定义为等效于*(b + n)
,并且当在指针算法(表达式b + n
)的上下文中使用数组时,它会衰减为指向其第一个元素的指针。因此,表达式b + n
的类型为char (*)[4]
,解除引用会再次生成类型为char[4]
的数组。
TL; DR :b[n]
的类型为char[4]
,与n
的值无关。
该类型是sizeof
操作的类型:sizeof(b[n])
完全等同于sizeof(char[4])
,并且保证始终会产生4
。