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

时间:2009-11-20 16:06:53

标签: c arrays gcc

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

#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;
}

如果DIM为8,则不会产生运行时错误,但只要DIM大于8,就会导致运行时错误“Segmentation Fault”。为什么???

3 个答案:

答案 0 :(得分:7)

几乎可以肯定是堆栈溢出。你正在分配什么,3 ^ 10 * 9 * sizeof(int)个字节!请改用int *a = (int*)malloc(N * sizeof(int)),其中N是您想要的整数。然后你可以在它上面模拟一个N维数组。

我将解释如何在一维数组上模拟二维数组。假设它有一行宽度为10.然后通过a[10 * 2 + 5]访问第三行的第五个值。通常,您执行a[width * (row - 1) + column]

第二种方法。您可以为指针的指针分配一个指针数组:

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

...将此扩展到更多维度,作为读者的练习。

答案 1 :(得分:1)

数组的大小为3 ^ 10 * 8 * sizeof(int)。假设32位int,sizeof(int)是四个字节,并且数组的大小是:

3^10 * 8 * 4 = 1,889,568 bytes

所以你的堆栈不是那么大而且你的堆栈已经溢出。

答案 2 :(得分:1)

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

我猜您的堆栈限制为2Mbytes