动态分配的数组和堆损坏

Dynamically allocated arrays and heap corruption

本文关键字:损坏 数组 动态分配      更新时间:2023-10-16

我是一名新手程序员,正在与指针和动态数组分配作斗争。

对于我正在处理的程序,我需要使用用户输入为每个索引的维度和值分配一个2-D。

稍后,我使用delete[]取消分配数组,并得到一个堆损坏错误。

这是我的分配:

    cin>>w>>h;
    int** pond;
    //allocating array
    pond = new int*[w];
    for(int j = 0; j<w; j++)
    {
        pond[j] = new int[h];
    }

    // inputting array values
    for(int k = 0; k < h; k++)
    {
        for(int l = 0; l < w; l++)
        {
            cin>>entry;
            pond[l][w] = entry;
            cout<<"entry is: "<< pond[l][w]<<endl;
        }
    }
    cout<<pond[0][0]<<endl;

最后的cout语句试图验证数组中的一个值。问题是,它给出了类似于-8023940的随机数……一个甚至不接近用户输入的随机数,它是简单的整数(1-9)。但是,for循环中的cout语句会生成正确的值。

我的问题是,我在这里做错了什么?分配看起来很简单,但一旦它退出for循环,值就会变得疯狂。

这是我的整个程序:

#include <iostream>
#include <string>
using namespace std;

int main()
{
int trials = 0;
int w = 0;
int h = 0;
int entry = 0;
int fishMax = 0;
int holdFishRow = 0;
int holdFishCol = 0;
int fishTotal = 0;
int highRow = 0;
int highCol = 0;
char done = 's';

cin>>trials;
for(int i = 0; i < trials; i++)
{
    cin>>w>>h;
    int** pond;
    //allocating array
    pond = new int*[w];
    for(int j = 0; j<w; j++)
    {
        pond[j] = new int[h];
    }

    // inputting array values
    for(int k = 0; k < h; k++)
    {
        for(int l = 0; l < w; l++)
        {
            cin>>entry;
            pond[l][w] = entry;
            cout<<"entry is: "<< pond[l][w]<<endl;
        }
    }
    cout<<pond[0][0]<<endl;

    // "fishing"...bombing each array index bomberman style.
    for(int z = 0; z < h; z++)
    {
        for(int j = 0; j < w; j++)
        {
            for(int k = 0; k < h; k++)
            {
                holdFishCol = holdFishCol + pond[j][k];
                cout<<pond[j][k]<<endl;
            }
            for(int l = 0; l < w; l++)
            {
                holdFishRow += pond[l][z];
            }
            fishTotal = holdFishCol + holdFishRow;
            if(fishTotal > fishMax)
            {
                fishMax  = fishTotal;
                highRow = j;
                highCol = z;
            }

        }
    }


    cout<< "#"<<i<<": ("<<highRow<<", "<<highCol<<") "<<fishMax<<endl;
    for(int q = 0; q < w; q++)
    {
        delete[] pond[q];
    }
    delete[] pond;
}

cin>>done;
return 0;
}

它遍历给定的每个数组,并以交叉模式(如加号+)添加每个索引的值,对其求和,并为每个索引打分。

问题很可能是以下语句:

pond[l][w] = entry;

除非w小于h,否则您的书写是越界的。我怀疑你是指

pond[l][k] = entry;

更改此代码

pond = new int*[w];
for(int j = 0; j<w; j++)
{
    pond[j] = new int[h];
}

以下方式

pond = new int*[h];
for(int j = 0; j<h; j++)
{
    pond[j] = new int[w];
}

因为在数组的初始化中,您使用的第一个索引在[0,h)的范围内

// inputting array values
for(int k = 0; k < h; k++)
{
    for(int l = 0; l < w; l++)
    {
        cin>>entry;
        pond[l][w] = entry;
        cout<<"entry is: "<< pond[l][w]<<endl;
    }
}

即使在这个循环中也有一个拼写错误。代替

pond[k][w] = entry

应该有

pond[l][l] = entry

您总是为循环中的索引指定无效范围。所以你必须更新你所有的循环。