【问题标题】:C, does an array require more memory space than just its elements?C,数组是否需要比元素更多的内存空间?
【发布时间】:2017-03-25 17:13:39
【问题描述】:

假设我们有一个大小为 40 的 char 数组,

char buffer[40];

其次,假设这个数组已经满了,有人写了 40 个字符。

因此,我们可以说这个数组的元素占用 40 个字节,因为每个 char 是 1 个字节。

我的问题是: 我们的数组实际上在内存中占用了多少空间?它会占用 40 字节的空间,还是更多?是否需要额外的位来将此数组标识为 char 类型,是否需要额外的位来允许空终止?如果是这样,可能是我们需要大约 42 个字节来将这个数组存储在内存中。

因此,我想知道我是否可以在分配了 40 个字节的内存空间中可靠地容纳 40 个字符的数组。

【问题讨论】:

  • 你尝试了什么?调试器将很容易地显示这一点。或者打印数组的大小。你的代码在哪里?你的 C 书怎么说?为什么像 C 这样的完全静态类型的语言必须在运行时跟踪类型?
  • 一般所有的类型检查和如何访问不同类型的细节都是在编译时制定的,运行时不需要与变量一起存储额外的数据。
  • 您可以可靠地将 40 字节放入 40 字节数组中。你不能做的是将一个 40 个字符的以 nul 结尾的字符串放入一个 40 字节的数组中。它必须是 39 个字符加上 '\0' 终止符。
  • 谢谢大家,我真的很感激,发现你们所有的 cmets 都有帮助。我只是在一般地问这个问题,因为我正在计划一个影子文件系统并希望避免段错误(这里是内存新手)。
  • 明白了大卫,谢谢你的提示 :)

标签: c arrays memory-management


【解决方案1】:

与 Java 或 C# 等语言不同,C 在运行时不存储任何类型元信息。因此,char[40] 正好需要 40 个字节。

【讨论】:

    【解决方案2】:

    它正好占用sizeof buffer(一个常量)字节。
    因为buffer 是 40 个数组,char40 * sizeof (char) 相同,即 40(sizeof (char) 定义为 1)。

    字符串的终止零字节的最终空间必须是这 40 个字节中的一个。说明该字节是程序员的责任。

    【讨论】:

      【解决方案3】:

      正好需要40bytes,不需要检查类型。最终,我们从数组中存储 char 的 ASCII 值的二进制值。 由您决定如何以 int 或 char 形式打印此值。 关于终止的第二点,因此编译器不会放置任何终止,数组的 bcoz 大小是预定义的。编译器将打印或获取从 0 到定义大小的数组值。 这是我的理解, 如果我错了,请纠正我。

      【讨论】:

        【解决方案4】:

        一般来说,这是不正确的。 (我在这里考虑“struct []”。)但是,您已经专门询问了char[],所以它是。

        (此外,堆栈或堆上可能存在开销/填充,但这不是声明的数据结构的一部分。)

        至于 char[] 与字符和以 null 结尾的字符串有关(当然,有时会这样做),唯一分配的内存比您预期的多的情况是在字符串文字中:"8 chars" 等价于 { '8', ' ', 'c', 'h', 'a', 'r', 's', '\0' }。 (这对编译器被告知使用的源字符集和执行字符集做了一些假设,但你明白了。[可能是"₹" 相当于{ 0xE2, 0x82, 0xB9, 0x00 }])

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-26
          • 1970-01-01
          • 1970-01-01
          • 2017-07-06
          • 1970-01-01
          • 2018-02-19
          • 2012-10-30
          相关资源
          最近更新 更多