【问题标题】:Where is the memory allocated when I create this array? (C)创建此数组时分配的内存在哪里? (C)
【发布时间】:2013-10-05 21:02:10
【问题描述】:

假设我做了类似的事情:

char* test[] = {"foo","bar","car"};

如果我做了很长的路,这到底相当于什么?这是自动创建我需要释放的内存吗?我只是有点困惑。谢谢。

【问题讨论】:

  • 一个好的经验法则是,您只需要释放 a) 您创建的内存(例如,使用 mallocmmap),或 b) 由以下函数返回的内存明确记录您有责任这样做。

标签: c string memory-management


【解决方案1】:

test 是一个指向堆栈上 char 的指针数组,字符串文字 "foo","bar","car" 存储在只读位置。你不需要释放任何东西。

test[0]test[1]test[2] 指向只读数据。请阅读 C 中的范围规则和变量的生命周期。默认情况下,块中没有存储类说明符的变量具有 auto 存储类说明符,这意味着具有本地生命周期的变量。

{
    char* test[] = {"foo","bar","car"};
}
//cannot access test here 
test [0] = "new"; // Compile time error - ‘test’ undeclared

尝试将“bar”修改为“tar”时会出现运行时错误:

char* test[] = {"foo","bar","car"};
test[1][0] = "tar"; // Run-time error

不过这很好test[0] 开始从"foo" 指向"new"

test [0] ="new";

"foo" 的引用丢失。

【讨论】:

  • 如果这些值是只读的,我不能更改它们吗?我不能说 test[0] = "foo2" 吗?
  • 字符串文字存储在只读位置而不是指针本身。指针在块中具有本地生命周期。
  • 最后一个问题:执行“char* x”与“char x[10]”有什么区别?
  • 字符数组存储字符并可被索引 - arr[] = "test" 表示 - arr[0]=='t'arr[1]=='e' 等,与存储在只读位置但无法修改。不过,您可以指向字符串文字。
  • 测试可能不会分配在堆栈上。它可以是静态的(全局变量)。
【解决方案2】:

很长的路是用malloc,malloc是一个字符串的大小。

测试将被推送到堆中

http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

【讨论】:

  • malloc 在堆上分配内存;说“malloc 会将其压入堆栈”是不正确的或至少具有误导性。
【解决方案3】:

您正在声明一个指针数组。指针指向字符串文字。

变量test遵循正常规则,如果它是一个自动变量(某个函数内的作用域),当超出函数时,它就会超出作用域,所以你不必释放内存。如果它是静态分配的(全局或static 变量),它的寿命与程序一样长,因此您也不必释放内存。

指针指向的字符串字面量是静态存储的,所以你也不要释放它们。

【讨论】:

    【解决方案4】:

    Testcharecter pointers 的数组。当为数组提供值的初始化时,C 允许将方括号留空 [ ]。在这种情况下,编译器将假定数组的大小与大括号 { } 之间包含的值的数量相匹配。无需释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2017-06-15
      • 1970-01-01
      • 2017-02-28
      • 2021-03-29
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多