我从此算法中获得了分段错误(核心转储)。为什么?
使用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;
}
答案 0 :(得分:6)
您可能超过了堆栈大小。
如果您对K
和N
使用较大的值,请考虑将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;
}