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とに大きな値を使用している場合は、ヒープに配置する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

もう 1 つの方法は、配列をスタックからデータ セグメントに移動することです。

#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 に答える