动态分配的数组和堆损坏
Dynamically allocated arrays and heap corruption
我是一名新手程序员,正在与指针和动态数组分配作斗争。
对于我正在处理的程序,我需要使用用户输入为每个索引的维度和值分配一个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
您总是为循环中的索引指定无效范围。所以你必须更新你所有的循环。
相关文章:
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 损坏的结构字符数组 - sqlite C++
- C++ 删除[] 2D 数组导致堆损坏
- 类数组正在损坏数据
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- 数组变量周围的堆栈已损坏
- Arduino 数组中的值损坏
- malloc()内存损坏仅通过为特定数量编写int数组
- 填充另一个 2D 数组后,堆已损坏
- 在复制 delete[] 数组后在 C++ 中检测到堆损坏
- 数组问题:变量周围的堆栈'arr'已损坏
- 访问边界外的数组元素会损坏它
- 重叠的多维数组损坏
- C++ 删除数组时检测到堆损坏
- 动态数组的双重释放或损坏
- 将数据存储在char数组中导致变量周围损坏
- C++指针:数组的堆栈已损坏
- 我找不到导致我的数组在运行两次案例并退出后损坏的错误
- 字符指针指向字符串,然后指向字符串数组。"./a.out"中的错误:malloc():内存损坏:0x0900c3b0***
- 删除全局数组时堆损坏