指针的指针在C++中如何初始化char?

3
我可以帮你进行翻译。以下是关于C++初始化的疑问:

我对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的指针吗?

如果它是静态的,那么这个数组将被分配到栈上,所以这个数组是一个巨大的错误制造者吗?

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

3个回答

6
也许一张图片会有所帮助:
当你从 A_Function 返回时,charList 就被销毁了,但是其他两个变量仍然存在。由于你从 A_Function 返回的是 charList 的值,所以没有问题 - 你只是将相同的值存储在一个不同的变量中,前提是你实际上使用了从 A_Function 返回的值(即将其分配给某些东西)。
如果你不保留该值,就会出现内存泄漏 -- 你将不再拥有指向你在自由存储器上分配的两个指针数组的指针,因此你将无法释放它们。

5
动态内存(堆)中分配了一个由2个char *类型指针组成的数组。数组的每个元素都被设置为指向存储在静态内存中的字符串(字符串字面量)。静态内存既不是堆也不是栈。静态内存中的对象在程序运行期间一直存在。因此,从形式上讲,您的代码没有问题。
然而,使用char *指针指向字符串字面量并不是一个好主意。字符串字面量是不可修改的,因此在这种情况下使用const char *指针会更加合适。

哎呀,我不知道那个,@okami 我道歉。 - Anycorn
我不知道字符串字面量被存储在静态内存中 :-O - okami

1

您可以查看每个单独的new char*[2]部分,以了解它的作用:

new          dynamically allocate
new      [ ] an array
new      [2] of two
new char*[2] pointers to "char" objects

因此,它动态分配了一个包含两个指向char的指针的数组。它返回指向分配数组初始元素的指针(这是new数组形式始终返回的内容)。该指针存储在charList中。 charList在堆栈上(具有自动存储期),并指向位于堆上的动态分配数组。

动态分配数组中的两个指针charList [0]charList [1]被设置为指向字符串文字"abcde""fghij"。 字符串文字具有静态存储期,因此它们存在于程序运行的整个时间内。


那是我的困惑,如果我在方法返回后复制了栈上的charList,我无法确保charList与之前一样存在。 - okami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接