C 为什么无符号字符数组[10]的大小为10

C 为什么无符号字符数组[10]的大小为10,c,sizeof,C,Sizeof,字符大小为1字节,维基百科上说: sizeof用于计算任何数据类型的大小,以 表示类型所需的字节数 但是,我可以在无符号字符数组[10]0..10中存储11个字节,但是当我执行sizeof(array)时,我得到10个字节。有人能解释一下这种行为吗 注意:我在int数据类型上尝试过这个方法,sizeof(array)是40,我希望它是44 但是,我可以在无符号字符数组中存储11个字节[10] 不,您不能:10不是数组[10]的有效索引。数组的索引范围从零到大小减一 根据C99标准 6.5.3.4

字符大小为1字节,维基百科上说:

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

但是,我可以在
无符号字符数组[10]
0..10中存储11个字节,但是当我执行
sizeof(array)
时,我得到10个字节。有人能解释一下这种行为吗

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

但是,我可以在无符号字符数组中存储11个字节[10]

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

根据C99标准

6.5.3.4.3当[
sizeof
运算符]应用于具有类型
char
无符号char
有符号char
,(或其限定版本)的操作数时,结果为1

这就是为什么在所有符合标准的平台上,结果将是10

但是,我可以在无符号字符数组中存储11个字节[10]

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

根据C99标准

6.5.3.4.3当[
sizeof
运算符]应用于具有类型
char
无符号char
有符号char
,(或其限定版本)的操作数时,结果为1


这就是为什么所有符合标准的平台上的结果都是10。

否,有效索引将是
0-9
而不是
0-10
,它将存储
10
元素而不是
11
,因此
sizeof
的结果是正确的。超出索引
9
的访问将被禁止,is
6.5.6/8
的相关章节介绍了指针算法:

[…]如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的。如果结果指向数组对象的最后一个元素后一个元素,则不应将其用作计算的一元*运算符的操作数

<> P>不同于C++标准,它明确地声明了<代码>数组,其中n个元素编号为0到N-1 。看起来,您需要挖掘C标准中类似语句的示例。在
C99标准草案
章节
6.5.2.1/4
中,示例如下:

int x[3][5];
它接着说:

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


否,有效索引将是
0-9
not
0-10
,它将存储
10
元素not
11
,因此
sizeof
的结果是正确的。超出索引
9
的访问将被禁止,is
6.5.6/8
的相关章节介绍了指针算法:

[…]如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的。如果结果指向数组对象的最后一个元素后一个元素,则不应将其用作计算的一元*运算符的操作数

<> P>不同于C++标准,它明确地声明了<代码>数组,其中n个元素编号为0到N-1 。看起来,您需要挖掘C标准中类似语句的示例。在
C99标准草案
章节
6.5.2.1/4
中,示例如下:

int x[3][5];
它接着说:

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

也就是说

array[0],array[1],array[2],array[3].......array[9]
因此
sizeof(array)=10
是正确的

也就是说

array[0],array[1],array[2],array[3].......array[9]

因此
sizeof(array)=10
是正确的。

否,有效索引将为
0-9
。您可以在10个框中存储11个东西吗?这是个好把戏…这是个危险的把戏。第十一个盒子被称为缓冲区溢出。第十一个盒子是数组中的一个秘密隔间,你可以在这里隐藏有价值的东西,但偶尔会被RAM地精发现并吃掉你的有价值的东西。有时,当你把东西放在那里时,程序中的其他变量会嫉妒并改变它们的值。我打赌John Skeet可以在十个盒子中存储12个东西。不,有效的索引将是
0-9
。你可以在十个盒子中存储11个东西吗?这是个好把戏…这是个危险的把戏。第十一个盒子被称为缓冲区溢出。第十一个盒子是数组中的一个秘密隔间,你可以在这里隐藏有价值的东西,但偶尔会被RAM地精发现并吃掉你的有价值的东西。有时当你把东西放在那里时,程序中的其他变量会嫉妒并改变它们的值。我打赌John Skeet可以在十个盒子中存储12个东西..+1<代码>阵列[10]
有十个插槽。0到9。在
C
中,你可以超越界限,但你真的不应该…“但你不应该”并不能完全消除它。你不能不打破别的东西。操作系统将终止您的程序,或者您将弄乱您以后可能要用于其原始用途的内存。@xaxxon:或者,更糟糕的是,不会出现任何问题(除非您向重要客户演示该程序)。@xaxxon:“不应该”是正确的措辞。实际上,C标准使用“不应”来表示限制,这非常接近。写入
array[10]
会违反规则(因此您不应该这样做),但有时在物理上是可能的(因此您可以这样做)。此外,我们还收到了一些关于堆栈溢出的问题,这些问题来自于那些认为您不能这样做的人,他们会问为什么