我有一个家庭作业,我必须动态分配一个二维数组,当我的数组很长且很瘦时,我会遇到段错误,例如2x8,并且只有当某些值在数组中时才会出现问题。这是我制作数组然后删除它的代码。
int main()
{
int **p;
int w, h;
cin >> w >> h;
p= new int *[w];
for (int k=0; k<w; k++)
p[k]= new int[h];
for (int i=0; i<h; i++)
{
for(int k=0; k<w; k++)
{
cin >> p[i][k];
}
}
for (int k=0; k < w; k++)
delete []p[k];
delete []p;
return 0;
}
example input that causes seg fault:
8 2
5 4 2 3 0 1 2 5
2 0 1 0 9 6 3 2
使用gdb我发现在循环中第一次删除后就是segfaulting。
答案 0 :(得分:0)
您混淆了索引。您分配w
指针,但您的循环通过i
元素运行h
。
答案 1 :(得分:0)
分配值的循环交换了边界。
p
被赋予一个长度为w
的数组,但是循环到i
的迭代器h
用于索引它。
p= new int *[w];
....
cin >> p[i][k];
p[i][k]
读为p[i]
,然后由[k]
编入索引。