为什么sizeof unsigned char数组[10]是10

时间:2013-08-04 23:56:28

标签: c sizeof

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

  

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

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

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

3 个答案:

答案 0 :(得分:18)

  

但是,我可以在unsigned char数组[10]

中存储11个字节

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

根据C99标准

  

6.5.3.4.3 当[sizeof运算符]应用于类型为charunsigned charsigned char的操作数时,(或其合格版本)结果为1.

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

答案 1 :(得分:7)

不,有效索引将为0-9而不是0-10,它会存储10个元素而不是11,因此sizeof的结果是正确的。超出索引9的访问权限将超出范围undefined behaviorC99 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是正确的。