2009-11-20 113 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 

所以你堆棧並不大,你就溢出堆棧。

相關問題