以下代码编译成功但我在main
函数的第一行得到了Segmentation错误。我不知道为什么我会收到这个错误。
#include <stdio.h>
#include <math.h>
unsigned int prime=2;
void resetprimegenerator()
{
prime=2;
}
unsigned int getnextprime()
{
while(1)
{
if(isprime(prime))
return prime;
}
}
int isprime(unsigned int n)
{
int i=3,check=1;
if(n==2)
return n;
for(i=3;i<=sqrt(prime);i+=2)
{
if(prime%i==0)
{
check=0;
break;
}
}
return check;
}
int main()
{
int t,n,i=0,j=0;
int input[500];
unsigned int answer[500][5000];
scanf("%d",&t);
getchar();
while(t-->0)
{
scanf("%d",&input[i]);
getchar();
n=input[i];
j=0;
resetprimegenerator();
while(n-->0)
{
answer[i][j]=getnextprime();
j++;
}
i++;
}
for(i=0;i<t;i++)
{
for(j=0;j<input[i];j++)
{
if(j==input[i]-1)
printf("%u",answer[i][j]);
else
printf("%u ",answer[i][j]);
}
}
return 0;
}
我无法理解为什么会收到以下错误。
答案 0 :(得分:7)
unsigned int answer[500][5000];
假设unsigned int
是4个字节,此变量将占用大约10MB的堆栈大小。这比正常堆栈的大小要大,你所拥有的是stack overflow。
解决方案是使用动态分配,或使其为全局/静态。根据您的需要选择。
答案 1 :(得分:4)
声明
时,您的堆栈空间不足unsigned int answer[500][5000];
相反,在堆上分配它;使用malloc()。
例如,您可以使用指向数组的指针:
int ( *array )[5000] = malloc( sizeof( *array ) * 500 ) ;
array[0][0] = 1234 ;
其中sizeof( *array )
的值等于sizeof(int) * 5000