如何在c++中初始化指针数组

How to initialize a pointers array in c++

本文关键字:初始化 指针 数组 c++      更新时间:2023-10-16

我使用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];

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

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

我在这里省略了images,因为这个整数指针数组表明了您的思维中可能存在的缺陷,这也反映在images数组中。

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

你是不是真的想说

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

一个整数数组,现在可以实际存储数字?

也许这是同样的问题与你的图像数组,因为你正在形成一个数组的图像指针。现在,一个图像,不管它实际上是什么,可能确实更应该有一个指向图像的指针数组——这实际上是一个更常见的概念,而不是指向整数的指针数组。

那么,现在的问题是,如果你有一个图像指针数组,你指向的图像在哪里?过一段时间,你是否在做:

images[ n ] = new image;

或者类似的东西?这至少会把入口n指向一个图像。或者,您真的想创建一个图像数组吗?如上所述,我建议创建一个整数数组:

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

我认为你要做的是初始化一个动态二维数组的int和类型的图像。下面是一个初始化序列变量的工作示例:

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

这是假设你的2D数组NxN

2D数组就是指向指针数组的指针所以代码首先初始化指向指针数组的指针:

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

但是现在你有了一个不指向任何地方的指针数组,所以你还必须初始化它们:

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

我将留给您为images变量做同样的事情。