我是一个与指针和动态数组分配搏斗的新手程序员。
对于我正在进行的程序,我需要使用用户输入为每个索引的维度和值分配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;
}
遍历每个给定的数组,并以交叉模式(如加+)添加每个索引的值,对其进行总计,并为每个索引提供分数。
答案 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
您始终为循环中的索引指定无效范围。所以你必须更新你所有的循环。