我正在尝试在运行时分配二维数组。阵列的大小是N * N,其中N是由用户输入的。 最后我删除了分配的内存。但我得到了分段错误。 我知道当我尝试访问未由我分配的内存时会发生分段错误。请帮助代码如下:
#include<iostream>
using namespace std;
#include <stdio.h>
int main ()
{
int t,n;
int **judge;
int **result;
int i,j,l;
int high;
float count;
int item;
cin>>t;
while(t-->0)
{
cin>>n;
judge=new int*[n];result=new int*[n];
for(i=0;i<n;i++)
{
judge[i]=new int[n];
result[i]=new int[n];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>judge[i][j];
}
}
count=0;
result[0][0]=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
item=0;
if(j>0&&i>0)
{
if(item<result[i][j-1])
item=result[i][j-1];
else if(item<result[i-1][j])
item=result[i-1][j];
}
else if(i==0)
{
if(item<result[i][j-1])
item=result[i][j-1];
}
else if(j==0)
{
if(item<result[i-1][j])
item=result[i-1][j];
}
result[i][j]=judge[i][j]+item;
}
}
if(result[n-1][n-1]<0.0)
cout<<"Bad Judges"<<endl;
else
{
count=(result[n-1][n-1]/(float)n);
cout<<count<<endl;
}
for( i = 0 ; i < n ; ++i)
{
delete[] result[i] ;
}
delete[] result;
for(i = 0 ; i < n ; ++i)
{
delete[] judge[i] ;
}
delete[] judge;
/* for(i=0;i<n;i++)
{
delete[] judge[i];
delete[] result[i];
}*/
// delete[] judge;
//delete[] result;
}
}
答案 0 :(得分:3)
你循环judge
直到n+2
并且你没有分配那么多。
在这三行中:
for(int i = 0 ; i < n + 2 ; ++i)
{
delete[] judge[i] ;
}
顺便说一下,这不是您唯一一次访问未分配的内存:
for(i=1;i<n+1;i++)
{
for(j=1;j<n+1;j++)
{
cin>>judge[i][j];
}
}
此处i
和j
最多可达n
,而您的分配最多允许n -1
。
答案 1 :(得分:0)
有很多循环,比如
for(i=1;i<n+1;i++)
在C ++中,数组从0开始索引,因此您应该使用[0..n)而不是
for(i=0;i<n;i++)