如何在 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++ 中初始化一个指针数组的主要内容,如果未能解决你的问题,请参考以下文章