C中的四维整数数组

use*_*290 0 c

我想使用4维数组.

int A[80][80][80][80];
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时,我得到分段错误(核心转储).例如:

for(i=0;i<80;i++)
 for(j=0;j<80;j++)
   for(k=0;k<80;k++)
    for(l=0;l<80;l++)
         A[i][j][k][l]=i+j+k+l;

printf("%d\n",A[0][1][2][3]);
Run Code Online (Sandbox Code Playgroud)

sim*_*onc 7

这是一个非常庞大的数组 - 40,960,000 * sizeof(int)字节.如果你在栈上声明它,你肯定会溢出可用的堆栈内存.尝试堆分配它.

int* A = malloc(80 * 80 * 80 * 80 * sizeof(int));
/* use A */
free(A);
Run Code Online (Sandbox Code Playgroud)

或者,更好,正如John Bode所说

int (*A)[80][80][80] = malloc( sizeof *A * 80 );

for (i=0; i<SIZE; i++) {
    for (j=0; j<SIZE; j++) {
        for (k=0; k<SIZE; k++) {
            for (l=0; l<SIZE; l++) {
                A[i][j][k][l] = i+j+k+l;
            }
        }
    }
}
printf("%d\n",A[0][1][2][3]);

free(A);
Run Code Online (Sandbox Code Playgroud)

  • 一个全局变量可能会给你一个160MB的可执行文件映射到内存 - 这不是一个好方法.动态分配(您的示例代码使用)要好得多. (3认同)
  • 我更喜欢将它分配为`int(*A)[80] [80] [80] = malloc(sizeof*A*80);` - 你可以像普通数组一样索引它(`A [i] [J] [K] [L]`).不需要时髦的索引映射. (2认同)