通过指针打印二维数组获得垃圾值的原因



我有一个指向动态分配的二维数组的指针,我试图通过解引用指针来打印数组值。不知何故,有些数组下标显示的是垃圾值,即使我把它们都初始化为1。如果你能指出我做错了什么,我将不胜感激。

int main() {
int (*ptr)[4][4];
int** array;
array = new int*[4];
for (int i = 0; i < 4; i++)
{
array[i] = new int[4];
}
ptr = (int(*)[4][4])(*array);

for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
array[i][j] = 1;
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; ++j)
{
cout<<"Val "<<*ptr[i][j]<<" And index "<<i<<" and "<<j<<endl;
}
}
return 0; }

我输出:

Val 1 And index 0 and 0
Val 0 And index 0 and 1
Val 1 And index 0 and 2
Val 0 And index 0 and 3
Val 1 And index 1 and 0
Val 0 And index 1 and 1
Val 1 And index 1 and 2
Val 0 And index 1 and 3
Val 543973718 And index 2 and 0
Val 1852383332 And index 2 and 1
Val 10 And index 2 and 2
Val 0 And index 2 and 3
Val 0 And index 3 and 0
Val 0 And index 3 and 1
Val 0 And index 3 and 2
Val 0 And index 3 and 3

让我们看看你的基本代码。

int (*ptr)[4][4];
int** array;
array = new int*[4];
for (int i = 0; i < 4; i++)
{
array[i] = new int[4];
}
ptr = (int(*)[4][4])(*array);

这是重要的部分。让我们看看数组是什么

Array是指向指针的指针。当你以非常c风格的方式做这个时,你所做的是可以的。你为4个指针分配了空间,然后每个指针都为4个整型数分配了空间。这给了你一个4x4的数组。

但是ptr是什么呢?

int (*ptr)[4][4];

Ptr是一个指向4x4整数数组的指针。这不是数组的含义。数组是一个指向4个指针的指针,每个指针指向4个int类型的空间。它们不一样。

它们的存储方式不同。Array总共有5个指针:自身加上4个新指针。

ptr期望一个指针(自身)指向内存中连续的16个int,没有其他点。

这就是为什么它不像你期望的那样工作。


你也把它弄得太复杂了,但也许这是有原因的。c++的方法是大幅减少new/delete的数量。你可以在STL中使用容器。

或者你可以这样做:

int array[4][4];

不涉及指针。但也许你希望它是一个变量的原因。

相关内容

  • 没有找到相关文章

最新更新