C-多维数组导致分段错误(GCC)

C-多维数组导致分段错误(GCC),c,arrays,gcc,C,Arrays,Gcc,为什么如果我改变数组的一个维度的大小,我会得到一个运行时错误:“分段错误?”。例如: #include <stdio.h> #define DIM 8 int main(int argc, char **argv) { int a[3][3][3][3][3][3][3][3][3][3][DIM], b; a[1][1][1][1][1][1][1][1][1][1][1] = 2; b=a[1][1][1][1][1][1][1][1][

为什么如果我改变数组的一个维度的大小,我会得到一个运行时错误:“分段错误?”。例如:

#include <stdio.h>
#define DIM 8 
int main(int argc, char **argv)
{
    int a[3][3][3][3][3][3][3][3][3][3][DIM],
        b;
    a[1][1][1][1][1][1][1][1][1][1][1] = 2;
    b=a[1][1][1][1][1][1][1][1][1][1][1];
    printf("%d \n",b);
    return 0;
}
#包括
#定义尺寸8
int main(int argc,字符**argv)
{
int a[3][3][3][3][3][3][3][3][3][3][3][5],
B
a[1][1][1][1][1][1][1][1][1][1]=2;
b=a[1][1][1][1][1][1][1][1][1][1];
printf(“%d\n”,b);
返回0;
}

如果DIM为8,则不会生成运行时错误,但如果DIM大于8,则会导致运行时错误“分段错误”。为什么?

几乎可以肯定是堆栈溢出。您正在分配3^10*9*
sizeof(int)
bytes!使用
int*a=(int*)malloc(N*sizeof(int))
,其中N是所需的整数。然后你可以在上面模拟一个N维数组

我将解释如何在一维阵列上模拟二维阵列。。假设它有宽度为10的行。然后通过取[10*2+5]获取第三行的第五个值。一般来说,您可以
a[width*(row-1)+column]

第二种方法。可以将指针数组分配给int的指针:

int **a = (int**)malloc(rows * sizeof(int*))
for (int i=0; i<row; ++i)
    a[i] = (int*)malloc(columns * sizeof(int))
int**a=(int**)malloc(行*sizeof(int*))

对于(int i=0;i数组的大小为3^10*8*sizeof(int)。假设32位int,sizeof(int)为四个字节,数组的大小为:

3^10 * 8 * 4 = 1,889,568 bytes
所以你的堆栈没有那么大,你的堆栈溢出了

3*3*3*3*3*3*3*3*3*3*8 = 472392; 472392*4 /* sizeof (int) */ = 1889568 3*3*3*3*3*3*3*3*3*3*9 = 531441; 531441*4 /* sizeof (int) */ = 2125764 3*3*3*3*3*3*3*3*3*8=472392;472392*4/*sizeof(int)*/=1889568 3*3*3*3*3*3*3*3*3*9=531441;531441*4/*sizeof(int)*/=2125764

我猜你的栈限制为2MbEys/P>但是我需要11维数组,C没有新的[]操作,你是用MalCube()来解决这个问题,而不是C++。@蚂蚁:对不起,固定了它。“诺玛:为什么你一开始就需要它?!你可以模拟它(我将添加进去)。,或使用

int******
…但认真地说,您可能有设计缺陷。