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 char或signed char,(或合格的版本物)的结果是1.
这就是为什么在所有符合标准的平台上结果将是十分之一.
不,有效索引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是一个由三个元素对象组成的数组,每个元素对象是一个由五个整数组成的数组.