【问题标题】:Why would someone initialize unallocated memory in C?为什么有人会在 C 中初始化未分配的内存?
【发布时间】:2012-01-04 11:48:10
【问题描述】:

假设我确实像这样初始化一个数组:

char a[]="test";

这样做的目的是什么?我们知道内容可能会立即更改,因为它未分配,那么为什么有人会这样初始化数组?

【问题讨论】:

  • “未分配”是什么意思?在这种情况下,a 分配在堆栈上。
  • 是什么让你觉得a没有分配???你的例子相当于char a[5] = "test";
  • 阅读本文:它可能会帮助您解决所有问题:stackoverflow.com/questions/1773079/…

标签: c initialization memory-management


【解决方案1】:

为了澄清,由于 OP 所述的原因,此代码是错误的:

char* a;
strcpy(a, "test");

正如其他回复所指出的,语法“char a[] = “test””实际上并没有这样做。实际效果更像这样:

char a[5];
strcpy(a, "test");

第一个语句在本地堆栈上分配一个固定大小的静态字符数组,第二个语句初始化其中的数据。大小由字符串文字的长度确定。与所有堆栈变量一样,数组在退出函数作用域时会自动释放。

【讨论】:

  • +1:没有你的回答,我不会理解 OP 的问题
【解决方案2】:

这样做的目的是在堆栈或静态数据段上分配五个字节(取决于此 sn-p 出现的位置),然后将这些字节设置为数组 {'t','e','s','t','\0'}

【讨论】:

    【解决方案3】:

    此语法在堆栈上分配一个由五个字符组成的数组,相当于:

    char a[5] = "test";
    

    数组的元素被初始化为作为初始化器给出的字符串中的字符。确定数组的大小以适合初始化程序的大小。

    【讨论】:

      【解决方案4】:

      已分配。该代码相当于

      char a[5]="test";
      

      当您忽略数字时,编译器只需通过计算文字字符串中的字符来为您计算字符数组的长度。然后它将长度加 1 以包含必要的终止 nul '\0'。因此,数组的长度为 5,而字符串的长度为 4。

      【讨论】:

      • 字符串的长度是4,它的大小是5。
      • @ouah,为此更新了我的。感谢您的反馈以及任何进一步的反馈。
      【解决方案5】:

      数组已分配;它的大小是从用于初始化它的字符串文字推断出来的(总共 5 个字符)。

      你写了吗

      char *a = "test";
      

      那么所有将被分配的将是一个指针变量,而不是一个数组(字符串文字"test" 存在于内存中,因此它在程序启动时分配并保持到程序退出)。

      【讨论】:

        猜你喜欢
        • 2022-09-27
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2021-01-08
        相关资源
        最近更新 更多