假设我做了类似的事情:
char* test[] = {"foo","bar","car"};
如果我做了很长时间,那究竟是什么呢?这会自动创建我需要释放的内存吗?我有点困惑。感谢。
答案 0 :(得分:5)
您正在声明一个指针数组。指针指向字符串文字。
变量test
遵循正常规则,如果它是自动变量(某个函数内的范围),当超出函数时,变量超出范围,因此您不必释放内存。如果它是静态分配的(全局或static
变量),它的寿命与程序一样长,所以你也不必释放内存。
指针指向的字符串文字具有静态存储,因此您也不会释放它们。
答案 1 :(得分: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"
的{{1}}:
"foo"
test [0] ="new";
的引用丢失。
答案 2 :(得分:0)
漫长的方法是使用malloc,并将malloc用作字符串的大小。
测试将被推送到堆
答案 3 :(得分:0)
Test
是charecter pointers
的数组。当为数组提供值初始化时,C允许将方括号留空[]。在这种情况下,编译器将假定数组的大小与大括号{ }
之间包含的值的数量相匹配。没有必要释放。