如何在 C++ 中初始化一个指针数组

Posted

技术标签:

【中文标题】如何在 C++ 中初始化一个指针数组【英文标题】:How to initialize a pointers array in c++ 【发布时间】:2015-09-14 03:26:44 【问题描述】:

我使用 valgrind 测试了我的代码,发现问题可能出在我初始化指针数组的方式上。但我不确定问题出在哪里。

这是错误:

Conditional jump or move depends on uninitialised value(s)

==7846==    at 0x41065A: Scene::drawscene() const (scene.cpp:142)

==7846==    by 0x4111C3: main (testscene.cpp:48)

==7846==  Uninitialised value was created by a heap allocation

==7846==    at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==7846==    by 0x50C1829: operator new(unsigned long) (in /usr/lib/libc++abi.so.1.0)

==7846==    by 0x40FBE8: Scene::copy(Scene const&) (scene.cpp:45)

==7846==    by 0x40FB7C: Scene::Scene(Scene const&) (scene.cpp:22)

==7846==    by 0x41108E: main (testscene.cpp:41)

==7846== 
==7846== Conditional jump or move depends on uninitialised value(s)

==7846==    at 0x4107AB: Scene::drawscene() const (scene.cpp:149)

==7846==    by 0x4111C3: main (testscene.cpp:48)

==7846==  Uninitialised value was created by a heap allocation

==7846==    at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==7846==    by 0x50C1829: operator new(unsigned long) (in /usr/lib/libc++abi.so.1.0)
==7846==    by 0x40FBE8: Scene::copy(Scene const&) (scene.cpp:45)
==7846==    by 0x40FB7C: Scene::Scene(Scene const&) (scene.cpp:22)
==7846==    by 0x41108E: main (testscene.cpp:41)

我初始化数组的方式如下:

 Image** image;
    int** sequence;
    images = new Image*[max];
    sequence = new int*[max];

【问题讨论】:

scene.cpp:45 is images = new Image*[max]; 什么是images?无论如何,你需要确保所有的指针都指向正确的地方。 所以我需要先将它们指向 NULL 吗? images 是一个指针数组 为什么不改用std::vector 仅当您希望/需要它们指向 NULL 时。如果您不了解指针,请不要使用它们。 【参考方案1】:

在我看来,这没什么意义:

int** sequence;
sequence = new int*[max];

我在这里省略了图像,因为这个整数指针数组表明你的想法可能存在缺陷,这也反映在图像数组中。

为什么有人会创建一个整数指针数组?在大多数硬件上,整数与指针大小相同,它们指向的实际整数在哪里?

你的意思是真的吗

int* sequence;
sequence = new int[max];

整数数组,现在可以实际存储数字了吗?

也许这与您的图像数组相同,因为您正在形成一个图像指针数组。现在,一个图像,无论它实际上是什么,可能确实更值得一个指向图像的指针数组 - 这实际上是一个比指向整数的指针数组更常见的概念。

所以,现在的问题变成了,如果你有一个图像指针数组,你指向的图像在哪里?你在稍后的某个时间做:

images[ n ] = new image;

或者类似的东西?至少,这会将条目 n 指向图像。或者,你真的是要创建一个图像数组,就像上面我建议的一个整数数组:

Image* image;
images = new Image[max];

【讨论】:

"为什么有人会创建一个整数指针数组?" - 为了实现一个多维数组,其中每一行是一个单独的分配。这很常见。 “在大多数硬件上,整数与指针大小相同” - 完全不相关。 “他们将指向的实际整数在哪里?” - 将由未来的分配分配 对于两个整数指针数组 - 是否有任何迹象表明指向指针的整数是数组本身? OP 声明“这是我初始化的方式”——没有关于分配的更多信息。没有迹象表明这种意图。然而,一般来说,我提出问题的方式是苏格拉底意义上的——让 OP 思考为什么要这样做?请注意,在讨论图像时,我确定了图像的分配,询问是否已完成 - 进一步讨论两个数组具有相同的问题 - 没有指示实际对象的分配。【参考方案2】:

我认为您要做的是初始化一个 动态 2D 数组 ints 和 Image 类型。这是一个初始化序列变量的工作示例:

int** sequences = new int*[max];
    for(int i = 0; i < max; ++i)
        sequences [i] = new int[max];

这是假设您的 2D 数组 属于 NxN

二维数组只是一个指向指针数组的指针,所以代码所做的,它首先初始化指向指针数组的指针:

int** sequences = new int*[max];

但是现在你有一个指向无处的指针数组,所以你还必须初始化它们:

for(int i = 0; i < max; ++i)
    sequences [i] = new int[max];

我会让你为 images 变量做同样的事情。

【讨论】:

以上是关于如何在 C++ 中初始化一个指针数组的主要内容,如果未能解决你的问题,请参考以下文章

C++结构体指针数组如何分配空间,用new

在 C++ 中初始化指针数组

带有空指针的 2D 指针数组 c++

如何从 C++ 中的 char 指针初始化 char 数组?

在 C++ 中使用指针初始化 char 数组或字符串

C#如何调用C++的DLL的结构体数组指针