分段错误语言c

时间:2013-11-09 22:49:35

标签: c segmentation-fault

我从此算法中获得了分段错误(核心转储)。为什么?

使用N和K的小值时是否有效?例如,N = 100且K = 10?

#include <stdio.h>
#include <stdlib.h>

#define N 400       
#define K 30        

int main()
{
int  i,j,k;
int A[K+1][N][N];
for (i=0;i<K+1;i++)
{
  for (j=0;j<N;j++)
  {
      for (k=0;k<N;k++)
      {

           A[i][j][k]=0; 
      }

  }
}
printf("A[%i][%i][%i] \n", i, j,k);
printf("OK");
return 0;
}

3 个答案:

答案 0 :(得分:6)

您可能超过了堆栈大小。

如果您对KN使用较大的值,请考虑将A放在堆上。

int *A = malloc((K+1) * N * N * sizeof(int));

索引:

A[(i*(K+1) + j)*N + k]=0;

(你想制作一个函数或宏)

完成A后,

free(A);

答案 1 :(得分:2)

您正在尝试创建一个大小为19.2 MB(31 * 400 * 400 * 4)的数组,其中4B是int类型的大小。静态分配超过8.37MB是不可能的,而是使用malloc。

答案 2 :(得分:0)

另一种方法是将数组从堆栈移出并进入数据段:

#include <stdio.h>
#include <stdlib.h>

#define N 400       
#define K 30        
int A[K+1][N][N];  // ADD THIS LINE

int main()
{
int  i,j,k;
// REMOVE THIS LINE int A[K+1][N][N];
for (i=0;i<K+1;i++)
{
  for (j=0;j<N;j++)
  {
      for (k=0;k<N;k++)
      {

           A[i][j][k]=0; 
      }

  }
}
printf("A[%i][%i][%i] \n", i, j,k);
printf("OK");
return 0;
}