0

我从这个算法中得到一个分段错误(核心转储)。为什么?

使用较小的 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;
}
4

3 回答 3

6

您可能会超出堆栈大小。

K如果您对and使用较大的值,请N考虑放入A堆中。

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

要对其进行索引:

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

(你想为此创建一个函数或宏)

一旦你完成了A

free(A);
于 2013-11-09T22:52:38.487 回答
2

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

于 2013-11-09T23:05:37.127 回答
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;
}
于 2013-11-09T23:56:32.480 回答