所以,最近我試着這樣做:創建動態分配數組使用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的實現是否可以做到這一點?
由於指針管理不善,您的代碼會調用未定義的行爲。您的C++編譯器或安裝沒有任何問題。 – PaulMcKenzie
如果您在調用'Foo'後檢查了'data'的值,那麼您應該已經看到'data'完全沒有改變。這就是給你的所有答案都會解釋的。另外:http://stackoverflow.com/questions/27487495/c-pointers-and-pointer-to-a-reference/27487983#27487983 – PaulMcKenzie
@PaulMcKenzie我在調用'Foo'後檢查過'data',但我注意到它沒有改變。不過,我的印象是,發送任何指向函數的指針都是通過引用。下面給出的答案確實解釋了我的問題,謝謝 – Woody1193