我的C++程序调试时出现“Program received signal SIGSEGV,Segmentation fault.”是什么原因,求指导。
#include <stdio.h>
int main()
{
long abs(long a);
int a,b,i,j,m,n,x;
long s1[1000][1000]={0},s2[1000][1000]={0};
while(scanf("%d %d",&a,&b)!=EOF)
{
m=0;
n=0;
for(i=0;i<a;i++)
for(j=0;j<b;j++)
scanf("%ld",&s1[i][j]);
for(i=0;i<a;i++)
for(j=0;j<b;j++)
s2[i][j]=abs(s1[i][j]);
x=s2[0][0];
for(i=0;i<a;i++)
for(j=0;j<b;j++)
if(s2[i][j]>x&&s2[i][j]<2147483648)
{
x=s2[i][j];
m=i;
n=j;
}
printf("%d %d %ld",m,n,s1[m][n]);
}
return 0;
}
long abs(long a)
{
if(a<0) a=-a;
return(a);
} 展开
你的程序是运行在linux上的吧?
1:错误信息的意思是收到一个信号,名字为段错误(信号值是11,程序收到这个信号的默认处理是退出),我看你应该是刚开始写程序不久,这个信号相信会一直陪伴着你的编程生涯,是程序运行最常见的错误之一。
2:这个信号产生的机制是由于程序试图访问他并没有权限访问的内存。操作系统为每个程序分配内存的时候都指定了访问权限,程序只能访问自己有权访问的内存。而软件导致这个信号产生的原因,一般情况下是内存越界访问,比如数组越界访问,线程栈溢出等等。
3:你的程序产生这个信号的原因本质也是越界
long s1[1000][1000]={0},s2[1000][1000]={0};
一个long类型是8字节,S1的大小是8000000字节也就是8MB,S1和S2加起来16MB,这2个变量都是局部变量,也就是栈变量,分配在内存的栈区。而linux默认一个程序的线程栈最大是10MB,所以越界了,把S1和S2改小点,比如改成S1[100][100],就可以正常运行了。
4:当然你也可以改linux的线程栈最大值,查下ulimit命令就可以了。或者用malloc将这2个变量动态分配在内存堆区上,堆区一般没限制大小。
long s1[1000][1000]={0},s2[1000][1000]={0};
这句话放在main函数外面当成全局变量就好了。不要在函数里开这么大的内存。
另外
s2[i][j]<2147483648
非常不建议这么写……鬼知道编译器能不能自动转换这个数到long int
要不然改成
s2[i][j]<2147483648ll
要不改成
s2[i][j]<=2147483647