1

char 的大小是 1 字节,维基百科说:

sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。

但是,我可以在0..10中存储11 个字节,但是当我这样做时,我会得到10 个字节。有人可以解释一下这种行为吗?unsigned char array[10]sizeof(array)

注意:我在 int 数据类型上试过这个,sizeof(array) 是 40,我希望它是 44。

4

3 回答 3

18

但是,我可以在 unsigned char array[10] 中存储 11 个字节

不,您不能: 10 不是array[10]. 数组的索引从零到大小减一。

根据 C99 标准

6.5.3.4.3当 [ sizeofoperator is] 应用于类型为 , 或 ,(或其限定版本)的操作数时,char结果unsigned charsigned char1。

这就是为什么在所有符合标准的平台上结果将是 10。

于 2013-08-04T23:57:40.603 回答
7

不,有效索引将0-9not 0-10,它将存储10元素 not 11,因此结果sizeof是正确的。超出索引的访问9将超出范围和未定义的行为C99 draft standard, is的相关部分6.5.6/8涵盖了指针运算:

[...] 如果指针操作数和结果都指向同一个数组对象的元素,或者超过数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。如果结果指向数组对象的最后一个元素,则不应将其用作计算的一元 * 运算符的操作数。

与明确声明的 C++ 标准不同,array has N elements numbered 0 to N-1您似乎需要深入研究示例以获取 C 标准中的类似声明。在C99 draft standard部分6.5.2.1/4中,示例是:

int x[3][5];

它继续说:

这里 x 是一个 3 x 5 的整数数组;更准确地说,x 是一个由三个元素对象组成的数组,每个对象都是一个由五个整数组成的数组。

于 2013-08-04T23:58:44.563 回答
1
unsigned char array[10];/*Array of 10 elements*/

意思是

array[0],array[1],array[2],array[3].......array[9]

所以sizeof(array)=10是正确的。

于 2013-08-05T04:25:06.753 回答