2009-11-20 111 views
2

为什么如果我改变数组的某个维度的大小,我会得到一个运行时错误:“Segmentation Fault?”。例如:C -multidimensional array cause Segmentation Fault(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][1][1][1]; 
    printf("%d \n",b); 
    return 0; 
} 

如果DIM是8它不会产生运行时错误,只是如果DIM大于8,它会导致运行时错误“段错误”。为什么?

回答

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 

我猜你的筹码是有限的,以2M字节

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)) 

...这延伸到多个维度作为练习留给读者。

+0

但我需要11维数组和C有没有新的[]操作数 – psihodelia 2009-11-20 16:12:12

+0

你的意思是使用malloc() - 这是一个C的问题,而不是C++。 – Ant 2009-11-20 16:12:13

+1

@Ant:对不起,修正了它。 @Norma:你为什么首先需要这个?你可以模拟它(我会加入它),或者使用'int *******'......但是严肃地说你可能有一个设计缺陷。 – int3 2009-11-20 16:17:57

1

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

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

所以你堆栈并不大,你就溢出堆栈。

相关问题