首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么未签名的字符array[10]大小为10

为什么未签名的字符array[10]大小为10
EN

Stack Overflow用户
提问于 2013-08-04 23:56:28
回答 3查看 6.2K关注 0票数 1

char的大小是1字节,wikipedia说:

size of用于计算任何数据类型的大小,以表示该类型所需的字节数为单位。

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

注意:我在int数据类型上尝试过这种方法,它的大小(数组)是40,我希望它是44。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-04 23:57:40

但是,我可以在无符号字符array10中存储11个字节。

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

按照C99标准

6.5.3.4.3sizeof运算符应用于具有charunsigned charsigned char类型(或其限定版本)的操作数时,结果为1。

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

票数 18
EN

Stack Overflow用户

发布于 2013-08-04 23:58:44

不,有效的索引是0-9而不是0-10,它将存储10元素而不是11,因此sizeof的结果是正确的。超出索引9的访问将超出界限,未定义行为C99 draft standard的相关部分是6.5.6/8,它涵盖指针算法:

..。如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。如果结果指向数组对象的最后一个元素,则不应将其用作求值的一元*操作符的操作数。

与C++标准(它显式地声明了一个array has N elements numbered 0 to N-1 )不同,您似乎需要深入研究C标准中类似语句的示例。在C99 draft standard6.5.2.1/4中,示例如下:

代码语言:javascript
复制
int x[3][5];

它接着说:

这里,x是一个3x5个ints数组;更确切地说,x是一个由三个元素对象组成的数组,每个元素对象都是一个由5个ints组成的数组。

票数 7
EN

Stack Overflow用户

发布于 2013-08-05 04:25:06

代码语言:javascript
复制
unsigned char array[10];/*Array of 10 elements*/

这意味着

代码语言:javascript
复制
array[0],array[1],array[2],array[3].......array[9]

所以sizeof(array)=10是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18048852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档