2016-11-20 83 views
-1

我想在c中創建一個多維數組。出於測試目的,我試圖打印第一行的第一個元素。該代碼似乎正在達到這一點;然而,當我嘗試打印單元第二次,我得到一個分段錯誤:打印元素的數組兩次導致分割錯誤

#include <stdbool.h> 
#include <stdio.h> 

typedef struct Matrix { 
    bool** elem; 
    int length; 
} Matrix; 

void generateMatrix(Matrix* m); 

int main() { 
    Matrix m = {0, 0}; 
    generateMatrix(&m); 

    fprintf(stdout, "%d ", m.elem[0][0]); 

    fprintf(stdout, "\n"); 

    // Comment next line if you want it to work 
    fprintf(stdout, "%d ", m.elem[0][0]); 

    return 0; 
} 

void generateMatrix(Matrix* m) { 
    const int size = 2; 

    bool* ptrArray[size]; 
    bool ptr1[] = {false, false}; 
    bool ptr2[] = {true, true}; 

    ptrArray[0] = ptr1; 
    ptrArray[1] = ptr2; 
    m->elem = ptrArray; 
    m->length = size; 
} 

我使用Ubuntu的gcc的:

$ gcc --version 
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 

這究竟是爲什麼?

回答

1

的問題是在generateMatrix

這裏:

bool* ptrArray[size]; 
... 
m->elem = ptrArray; 

你正在使用的局部變量,它的壽命是有限的函數調用的引用,但你把它存放在返回的對象。

所以你得到未定義的行爲。

它第一次運行,因爲你很幸運,但第二次,不知何故內存被覆蓋(函數調用通常修改堆棧,局部變量通常存儲在堆棧中)。

修復:你確實有分配一些內存:

bool* ptrArray = malloc(size*sizeof(ptrArray[0])); 

內存有一個全球性的壽命。不能收集,除非你free它。