2015-11-15 57 views
0

所以,最近我試着這樣做:創建動態分配數組使用Xcode的G ++

void Foo(int **bar, int size) { 
    bar = new int *[size]; 
    for (int i = 0; i < size; i++) 
     bar[i] = new int[4]; 
    // Do other stuff 
    return; 
} 

int main(int argc, char *argv[]) { 
    int ** data; 
    int size = atoi(argv[1]); 
    Foo(data, size); 
    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < 4; j++) 
      cout << "i = " << i << ", j = " << j << ", data = " << data[i][j] << endl; 
     // Do other stuff 
    } 

    for (int i = 0; i < size; i++) 
     delete[] data[i]; 
    delete[] data; 
    return 0; 
} 

,並且總是我就在那個cout說法得到段錯誤。在更改代碼以便在main中動態分配數組後,問題就消失了。因此,segfault之間的區別在於數組是否在同一個函數中動態分配和銷燬。這對我來說似乎是錯誤的,因爲這對傳統的C++來說應該不成問題。我正在使用帶Xcode的MacBook作爲g ++命令。任何人都可以確認Xcode的實現是否可以做到這一點?

+1

由於指針管理不善,您的代碼會調用未定義的行爲。您的C++編譯器或安裝沒有任何問題。 – PaulMcKenzie

+1

如果您在調用'Foo'後檢查了'data'的值,那麼您應該已經看到'data'完全沒有改變。這就是給你的所有答案都會解釋的。另外:http://stackoverflow.com/questions/27487495/c-pointers-and-pointer-to-a-reference/27487983#27487983 – PaulMcKenzie

+0

@PaulMcKenzie我在調用'Foo'後檢查過'data',但我注意到它沒有改變。不過,我的印象是,發送任何指向函數的指針都是通過引用。下面給出的答案確實解釋了我的問題,謝謝 – Woody1193

回答

1

它不是特定於Xcode或g ++的 - 只是代碼中的一個錯誤 - 您需要通過bar引用才能將其用作輸出參數。

變化:

void Foo(int **bar, int size) 

到:

void Foo(int ** &bar, int size) 

注意,一般來說它是最好使用例如std::vector而不是裸排列的C風格的指針等。

+0

我真的不知道你能做到這一點 – Woody1193

0

您通過值傳遞數據給Foo,所以當您在Foo內部分配內存時,main()中的數據仍然未初始化。