为什么在n> 500时会出现seg故障?用C编写

时间:2016-05-25 01:49:38

标签: c segmentation-fault

在我为项目Euler中的问题28编写的下面一段代码中。它需要沿着不断增加的数字的扩展方块的两个对角线添加数字。当我设置num>500时,它会导致seg错误。直到这个限制它完美地运作。提前谢谢!

#include <stdio.h>

int main(){

  int n, num=501;
  int array[num-1][num-1];
  int p=((num+1)/2)-1;
  int count=25;
  int x;

    array[p][p]=1;
    array[p+1][p]=4;
    array[p+1][p+1]=3;
    array[p][p+1]=2;
    array[p-1][p+1]=9;
    array[p-1][p]=8;
    array[p-1][p-1]=7;
    array[p][p-1]=6;
    array[p+1][p-1]=5;  

    int i=10; 
  for (n=2;((n*2)+1)<=num;n++){



    for(x=0;x<n*2;x++){
       array[p+(x-(n-1))][p+n]=i;
       i++;
    }
    count+=(i-1);



    for(x=0;x<n*2;x++){
      array[p+n][p+(n-1)-x]=i;
      i++;
    }
          count+=(i-1);




    for(x=0;x<n*2;x++){
      array[p+((n-1)-x)][p-n]=i;
      i++;
    }
     i--;


        count+=i;
    for(x=0;x<=n*2;x++){
      array[p-n][p+(x-n)]=i;
      i++;
    }

        count+=(i-1);
 }

    printf("The answer is %lu\n", count);

}

1 个答案:

答案 0 :(得分:1)

我最好的猜测是,因为500*500*sizeof(int) == 1000000(假设sizeof (int) == 4),你已经耗尽了堆栈空间。我建议把它放在堆上:

typedef struct { int array[num - 1][num - 1] } arr;

int main(void)
{
    const int num = 501;
    int n;
    arr *array;
    int p = (num + 1) / 2 - 1;
    int count = 25;
    int x;

    array = malloc(sizeof arr);

    array->array[p][p] = 1;
    array->array[p + 1][p] = 4;
.
.
.