动态分配的数组和堆损坏

时间:2014-09-12 22:29:08

标签: c++ pointers memory-management dynamic-arrays

我是一个与指针和动态数组分配搏斗的新手程序员。

对于我正在进行的程序,我需要使用用户输入为每个索引的维度和值分配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;
}

遍历每个给定的数组,并以交叉模式(如加+)添加每个索引的值,对其进行总计,并为每个索引提供分数。

2 个答案:

答案 0 :(得分:2)

问题很可能就是这句话:

pond[l][w] = entry;

除非w小于h,否则你写的越界。我怀疑你的意思

pond[l][k] = entry;

答案 1 :(得分:0)

更改此代码

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

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