簡體   English   中英

C多維數組導致分段錯誤(GCC)

[英]C -multidimensional array causes 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,就會導致運行時錯誤“Segmentation Fault”。 為什么???

幾乎可以肯定是堆棧溢出。 你正在分配什么,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的指針數組:

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

......將其擴展到更多維度,作為讀者的練習。

數組的大小為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

我猜你的堆棧限制為2Mbytes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM