当前位置: 首页 > 知识库问答 >
问题:

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

葛意远
2023-03-14

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

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

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

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

共有3个答案

蔚元明
2023-03-14
unsigned char array[10];/*Array of 10 elements*/

这意味着

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

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

孔弘盛
2023-03-14

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

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

与明确声明数组具有编号为 0 到 N-1 的 N 个元素的 C 标准不同,看起来您需要深入研究 C 标准中类似语句的示例。在C99草案标准6.5.2.1/4节中,示例如下:

int x[3][5];

它继续指出:

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

王嘉木
2023-03-14

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

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

符合 C99 标准

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

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

 类似资料:
  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在

  • 我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。 上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复 我在 JNI C 文件中实现的函数返回一个 jstring。 所以我需要把无符号的char数组转换成jstring。 但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节

  • 我想优化我的代码,避免错误,我有这个功能,但我认为我可以改善和避免内存问题。 该函数的思想是接收这种样式的字符串“0123456789”并将其传递给0x01、0x23、0x45、...在无符号字符数组中。任何提示,良好的实践或改进将是非常有用的。 用法是这样的: 在函数缓冲区中结束如下:

  • 我正在尝试创建一个霍夫曼树,我看到的问题对我来说很奇怪,它如下: 给定以下数据结构: 编写一个程序,该程序将二进制文件的名称作为唯一参数,构建该文件的霍夫曼树,假设原子(基本符号)是8位无符号字符,并打印树和字典。 分配必须使用 malloc() 以外的任何东西来完成,排序可以使用 qsort() 来完成。 这里让我感到困惑的是,要编写一个程序来创建霍夫曼树,我们只需要做以下事情: 我们需要取一个

  • Í 具有需要返回 J 字节数组的 JNI 函数。该数组包含带有数据的 c 结构的字节数据。但是当我将数据从未编号的char数组传递到jbyte数组时,我遇到了错误。 C结构定义如下: JNI方法定义如下: 我得到的错误是: jni/帮助器函数.cpp:44:38: 错误: 不匹配 '运算符 =' 在 '*(数组 ((无符号的整数)索引)) = SendData.打包发送::字节 [索引]' 我的问

  • 为什么在C 11中无符号短*无符号短转换为int? int太小,无法处理这行代码显示的最大值。 MinGW 4.9.2溢流 因为(来源) USHRT_MAX=65535 (2^16-1)或更大* INT_MAX=32767 (2^15-1)或更大* 和(2^16-1)*(2^16-1)=~2^32。 这个解决方案会有什么问题吗? 此程序 给出输出 在…上 两者都有 这证明在这些编译器上,被转换为。

  • 问题内容: 显然,它不是根据长度来比较它们,而是通过编码来比较它们。但是,我不知道它是如何工作的。我需要一些解释:-) 问题答案: 字符串按字典顺序进行比较。即逐个字符,直到它们不相等或没有要比较的字符为止。“11”的首字符小于“ 3”的首字符。 如果我们使用字母,则因为不小于,不小于,但是由于小于,小于。 您可以将字符串显式转换为数字:

  • 问题内容: 我正在学习Java 8文档。我知道最大数组大小定义为均值2 ^ 31 – 8 = 2147483639 。然后,我集中讨论了为什么要减去8 或减去? 有些人根据文档给出了一些逻辑。因此,对于标题字,减去8。但是在这种情况下,如果标题字需要大于8,那么答案是什么? 请在此基础上澄清我。预先感谢您的合作。 问题答案: 阅读上述有关Java内存管理的文章,其中清楚指出 我认为这适用于Arra