我怀疑在C ++中初始化这个:
char** A_Function()
{
char** charList = new char*[2];
charList[0] = "abcde";
charList[1] = "fghij";
return charList;
}
编译此代码时没有问题,但我不确定这种行为。
1 - char列表:char *在堆上好吗? 2 - charList [n_position]是堆还是堆栈?
我不明白char * [2]真正意味着什么,是不是意味着: 它是一个静态数组,它的每个元素都有一个指向char的指针?
如果它是静态的,那么这个数组将在堆栈上分配,所以这个数组是一个巨大的bug制造者?
如果我是对的,如何在堆上分配它?
答案 0 :(得分:6)
也许照片会有所帮助:
当你从A_Function
返回时,charList
被摧毁,但其他两个保持不变。因为你从charList
返回A_Function
的值没有问题 - 你只需要在不同的变量中保存相同的值,至少假设你实际使用了来自A_Function
(即将其分配给某事)。
如果你没有保留这个值,你就会有内存泄漏 - 你将不再拥有指向你在免费商店分配的两个指针数组的指针,所以你将无法释放它们
答案 1 :(得分:5)
char *
类型的2个指针数组在动态内存(堆)中分配。数组的每个元素都设置为指向存储在 static 内存中的字符串(到字符串文字)。静态内存既不是堆也不是堆栈。只要程序运行,静态存储器中的对象就会存在。所以,正式地说,代码中没有问题。
但是,使用char *
指针指向字符串文字并不是一个好主意。字符串文字是不可修改的,因此const char *
指针在这种情况下会更合适。
答案 2 :(得分:1)
您可以查看new char*[2]
的每个部分,了解它的作用:
new dynamically allocate
new [ ] an array
new [2] of two
new char*[2] pointers to "char" objects
因此,它动态地为char
s分配两个指针的数组。它返回一个指向已分配数组的初始元素的指针(这是new
的数组形式总是返回的)。该指针存储在charList
中。 charList
在堆栈上(它具有自动存储持续时间)并指向动态分配的数组,该数组位于堆上。
动态分配的数组charList[0]
和charList[1]
中的两个指针分别设置为指向字符串文字"abcde"
和"fghij"
。字符串文字具有静态存储持续时间,因此它们在程序运行的整个时间内都存在。