指针指针c ++ char初始化

时间:2010-09-10 02:23:24

标签: c++ arrays pointers initialization char

我怀疑在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制造者?

如果我是对的,如何在堆上分配它?

3 个答案:

答案 0 :(得分:6)

也许照片会有所帮助:

alt text

当你从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"。字符串文字具有静态存储持续时间,因此它们在程序运行的整个时间内都存在。