多维数组的大小

3
我尝试获取多维数组的大小,并编写了以下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是如何工作的吗?为什么第三个打印输出相同?

2
sizeof() 返回 size_t,你需要使用 %zu 作为格式说明符。 - RoadRunner
也许这个链接可以帮到你。https://dev59.com/bGkv5IYBdhLWcg3w400Y - Muhammad Haroon Iqbal
@RadRunner 很好的建议。我会确保在使用C99及更高版本时使用%zu。否则,我可能只能使用%u。 - MCG
2
@MCG:无论你使用什么,不要忘记将值转换为适当的类型。如果你想使用 %u,那么应该是 printf("... %u...", (unsigned) sizeof(b[5])); - AnT stands with Russia
3
从非常吹毛求疵的角度来看,在这种情况下,OP使用的是 sizeof 而不是 sizeof()() 是参数表达式的一部分(顺便说一句,是一部分多余的内容),而不是运算符本身的一部分 :) (翻译者注:OP指原帖作者,sizeof是一个C++操作符,用于计算数据类型或变量的大小,而()在这里是指函数调用时的参数列表,因此在这个语境中并不需要加上括号。) - AnT stands with Russia
@AnT 是的,你说得对。使用 sizeof b[3] 是可以接受的。 - RoadRunner
2个回答

8

b是一个二维字符数组,有3行和4列。

因此,如果你采用sizeof(b),你将得到12

b[0](以及一般的b[i])的类型为大小为4的一维字符数组。因此,如果你采用sizeof (b[0]),你将得到4

b[0][0](以及一般的b[i][j])的类型为char。因此,如果你采用sizeof (b[0][0]),你将得到1

sizeof不依赖于数组索引。即使对于b[0]b[100],类型仍然保持不变,尽管它可能超出了数组内存的范围。


1
@RishikeshRaje sizeof() 不会检查约束条件。例如在 b[100] 中的答案仅为 4 - jack jay
3
在非评估上下文中,sizeof b[5] 完全没有问题(因为 b[i] 不是可变长度数组)。 - AnT stands with Russia
声称“C语言可以轻松地将数据分配给b[100]”是不正确的。这将触发未定义行为。未定义行为可以以许多不同的方式表现出来,包括在编译时作为编译器拒绝翻译代码。 - AnT stands with Russia

1
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接