【发布时间】:2016-03-29 13:06:21
【问题描述】:
一个简单的程序编译良好,但运行时出错:segmentation fault: 11
int length=10000;
int num=100;
int num1=20;
int datablocklen=400002; //datablocklen=2*num1*length+2
int main(){
double arr[num*length];
double res[num][num];
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
res[i][j]=0;
}
}
for(int i=0;i<(num*length);i++){
arr[i]=i;
}
int ntile=(int)(num/num1);
double array_task[datablocklen];
for(int i=0;i<ntile;i++){
for(int j=0;j<ntile;j++){
array_task[datablocklen-2]=i*num1*length;
array_task[datablocklen-1]=j*num1*length;
for(int k=0;k<(num1*length);k++){
array_task[k]=arr[i*num1*length+k];
array_task[num1*length+k]=arr[j*num1*length];
}
}
}
return 0;
}
gcc -o test -std=c99 test.c 获取可执行文件。
还是很奇怪,如果长度被分配一个小的值,比如1000,错误不会出现。但是当它大于10000时,就会发生分段错误。
请注意,我始终关注 datablocklen 的值,以确保 datablocklen=2*num1*length+2。所以如果length 或num1 改变,我也会改变变量datablocklen。
我在 mac、OS yosemite 下处理 gdb 时仍有一些问题。所以我没有用gdb调试过程序。但是,如果我注释了内部 for 循环,即由 k 索引的循环,程序执行得很好。我的意思是,没有错误消息。
【问题讨论】:
-
计算机可能很强大,但也有局限性。你不能只投入大量的数字并期望一切顺利进行。如果您确实需要使用大量数字,请尝试使用 Ruby 或 Python 3。
-
@SouravGhosh 我不确定。我看到页面说这种错误可能是由于内存或交换限制,或者 stackoverflow 的事情。我不知道。
-
是堆栈溢出,将
-fsanitize=address添加到gcc中,再次运行。另外,我用 gcc 优化-O2对其进行了测试,它没有 segv ... gdb 跟踪在这里 pastebin.com/SyXWdrpt -
@Lundin 很好的解释。
标签: c