【问题标题】:Dynamically allocated arrays and heap corruption动态分配的数组和堆损坏
【发布时间】:2014-09-12 22:29:07
【问题描述】:

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

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

我后来使用 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;
}

它遍历每个给定的数组,并以交叉模式(如加号+)添加每个索引的值,总计,并为每个索引给出分数。

【问题讨论】:

  • w 分配数组时为0。
  • pond[l][w]=entry;?这很糟糕。
  • 我想到了,但是每次我测试程序时,我都会提供 w 和 h 的值 3,以创建一个简单的 3x3 数组。但是,我将添加一些代码来防止这种情况发生。谢谢。
  • @Deduplicator 以什么方式?有人告诉我,我可以通过这种方式提供值。不想争论,但有什么更好的方法?
  • 我的意思是那条线不好。尺寸为wh,但lw 的最大值为w-1 w。看到问题了吗?

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


【解决方案1】:

问题很可能是这样的说法:

pond[l][w] = entry;

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

pond[l][k] = entry;

【讨论】:

    【解决方案2】:

    更改此代码

    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
    

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

    【讨论】:

    • @Deduplicator 用于在循环中正确写入范围。
    • 非常感谢,调试时需要仔细阅读我的代码。
    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2013-09-02
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多