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

Max*_* S. 1 c sizeof

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

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

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

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

das*_*ght 18

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

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

根据C99标准

6.5.3.4.3当[ sizeof被操作员]应用于具有类型的操作数char,unsigned charsigned char,(或合格的版本物)的结果是1.

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

  • @xaxxon:或者更糟糕的是,在您向重要客户展示该程序之前,不会出现任何问题. (6认同)
  • +1.`array [10]`有十个插槽.0到9.在`C`中你可以超越界限,但你真的不应该...... (5认同)
  • @xaxxon:"不应该"是正确的措辞.实际上,C标准使用"不应该"来表达限制,这是非常接近的.写入`array [10]`会违反规则(所以你不应该这样做),但有时候它是物理上可行的(所以你可以这样做).此外,我们对那些认为你无法解决为什么他们在尝试时没有收到错误的人提出了Stack Overflow的问题.所以我们真的必须解释你**可以**,但你**不会**,如果你尝试可能会发生不好的事情. (5认同)
  • "但你不应该"并没有完全削减它.你不能不打破别的东西.操作系统将终止您的程序,否则您将搞乱您可能希望以后用于其原始目的的内存. (2认同)
  • @EricPostpischil所以[这个](http://i.imgur.com/pkIbjnO.jpg)是C标准所说的? (2认同)

Sha*_*our 7

不,有效索引0-9不会0-10,它会存储10元素11,因此结果sizeof是正确的.访问超出索引9将超出范围和未定义的行为,C99 draft standardis 的相关部分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];
Run Code Online (Sandbox Code Playgroud)

它继续说:

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

  • @WayneUroda:C标准仅在数组内定义指针算法,并在数组的最后一个元素之外定义一个元素.任何其他指针算术(因此任何下标)都是未定义的.超出最后一个元素的位置一个元素可以用于算术,但是它可以不被解除引用.Per C 2011(N1570)6.5.6 8:"如果结果指向数组对象的最后一个元素之后,则不应将其用作被评估的一元`*`运算符的操作数."(注意:对于指针算术,单个对象充当一个元素的数组.) (4认同)