char 的大小是 1 字节,维基百科说:
sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。
但是,我可以在0..10中存储11 个字节,但是当我这样做时,我会得到10 个字节。有人可以解释一下这种行为吗?unsigned char array[10]
sizeof(array)
注意:我在 int 数据类型上试过这个,sizeof(array) 是 40,我希望它是 44。
但是,我可以在 unsigned char array[10] 中存储 11 个字节
不,您不能: 10 不是array[10]
. 数组的索引从零到大小减一。
根据 C99 标准
6.5.3.4.3当 [
sizeof
operator is] 应用于类型为 , 或 ,(或其限定版本)的操作数时,char
结果unsigned char
为signed char
1。
这就是为什么在所有符合标准的平台上结果将是 10。
不,有效索引将0-9
not 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 是一个由三个元素对象组成的数组,每个对象都是一个由五个整数组成的数组。
unsigned char array[10];/*Array of 10 elements*/
意思是
array[0],array[1],array[2],array[3].......array[9]
所以sizeof(array)=10
是正确的。