char的大小是1个字节,维基百科说:
sizeof用于计算任何数据类型的大小,以 表示类型所需的字节数。
但是,我可以在unsigned char array[10]
0..10中存储 11个字节,但是当我sizeof(array)
时,我会 10个字节。有人可以解释这个行为吗?
注意:我在int数据类型上试过这个,sizeof(数组)是40,我希望它是44。
答案 0 :(得分:18)
但是,我可以在unsigned char数组[10]
中存储11个字节
不,你不能:10不是array[10]
的有效索引。数组的索引从零到大小减一。
根据C99标准
6.5.3.4.3 当[
sizeof
运算符]应用于类型为char
,unsigned char
或signed char
的操作数时,(或其合格版本)结果为1.
这就是为什么在所有符合标准的平台上结果将是十分之一。
答案 1 :(得分:7)
不,有效索引将为0-9
而不是0-10
,它会存储10
个元素而不是11
,因此sizeof
的结果是正确的。超出索引9
的访问权限将超出范围undefined behavior,C99 draft standard
的相关部分为6.5.6/8
,其中包含指针算术:
[...]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。如果结果指向数组对象的最后一个元素之后,则不应将其用作被计算的一元*运算符的操作数。
与明确陈述array has N elements numbered 0 to N-1
的C ++标准不同,您需要深入研究C标准中类似语句的示例。在C99 draft standard
部分6.5.2.1/4
中,示例为:
int x[3][5];
然后继续陈述:
这里x是一个3 x 5的整数数组;更确切地说,x是一个由三个元素对象组成的数组,每个元素都是一个包含五个整数的数组。
答案 2 :(得分:1)
unsigned char array[10];/*Array of 10 elements*/
表示
array[0],array[1],array[2],array[3].......array[9]
所以sizeof(array)=10
是正确的。