5

假设我做了类似的事情:

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

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

4

4 回答 4

5

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

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

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

于 2013-09-30T05:12:12.000 回答
2

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],开始指向"new"from "foo"

test [0] ="new";

引用"foo"丢失。

于 2013-09-30T05:10:34.420 回答
0

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

测试将被推送到堆上

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

于 2013-09-30T05:12:00.460 回答
0

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

于 2013-09-30T05:14:20.097 回答