我创建这个数组时分配的内存在哪里?(C)

zPr*_*mer 5 c string memory-management

假设我做了类似的事情:

char* test[] = {"foo","bar","car"};
Run Code Online (Sandbox Code Playgroud)

如果我做了很长的路,那究竟是什么呢?这会自动创建我需要释放的内存吗?我有点困惑.谢谢.

Yu *_*Hao 5

你正在声明一个指针数组.指针指向字符串文字.

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

指针指向的字符串文字具有静态存储,因此您也不会释放它们.


Sad*_*que 2

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

\n\n

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

\n\n
{\n    char* test[] = {"foo","bar","car"};\n}\n//cannot access test here \ntest [0] = "new"; // Compile time error - \xe2\x80\x98test\xe2\x80\x99 undeclared\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
char* test[] = {"foo","bar","car"};\ntest[1][0] = "tar"; // Run-time error\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这很好test[0]开始指向:"new""foo"

\n\n
test [0] ="new";\n
Run Code Online (Sandbox Code Playgroud)\n\n

的引用"foo"丢失。

\n