【发布时间】:2011-12-27 17:35:49
【问题描述】:
以下使用 sieve 打印一些素数的代码会在在线判断上生成 SIGSEGV 错误。
int main()
{
long count=1;
int arr[100000000];
printf("2\n");
for(long i=3;i<100000000;i=i+2)
{
arr[i]=1;
}
for(long i=3;i<100000000;i=i+2)
{
if(arr[i]==1)
{
count++;
if(count%100==1)printf("%ld\n",i);
for(long j=2;i*j<100000000;j++)
arr[i*j]=0;
}
}
//scanf("%ld",&count);
}
但如果我删除一些语句为:
for(long i=3;i<100000000;i=i+2)
{
if(arr[i]==1)
{
count++;
}
}
如上修改第二个循环。它没有显示错误。关于为什么会发生这种情况以及如何在第一个程序中更正此问题是否可以提供一些帮助。
【问题讨论】:
-
你在调试器中运行过这个吗?这将告诉您是哪条线路导致了 seg-fault。
-
int arr[100000000];正在堆栈上创建,这是一个巨大的大小,您应该考虑动态分配数组,或者更好地使用std::vector。
标签: c++ loops memory stack-overflow segmentation-fault