我有以下簡化代碼來為另一個函數的數組分配空間和賦值,該函數通過指向數組的指針傳入。索引到解除引用的指針時會導致崩潰:
void foo(int **arr) {
int num_elements = 3;
*arr = malloc(num_elements*sizeof(int));
for(int i=0; i<num_elements; i++){
*arr[i] = i; // crashes here
}
}
int main(){
int *main_arr = NULL;
foo(&main_arr);
// Doesn't get here
for(int i=0; i<3; i++)
printf("%d ", main_arr[i]);
printf("\n");
return 0;
}
我期待輸出0 1 2
,但我看到了Segmentation fault (core dumped)
。我正在做的事情的邏輯似乎很合理,所以我不知道該怎麼辦。
結果證明這個問題是模棱兩可的:雖然代碼的邏輯是合理的,但在崩潰的那一行我解釋為“取消引用,然後訪問第 i 個元素”,但編譯器顯然解釋為“訪問第 i 個元素” ,然後取消引用”。事實上,使用括號明確說明我的意圖解決了這個問題:更改為
for(int i=0; i<num_elements; i++)
(*arr)[i] = i
產生所需的0 1 2
輸出。事實證明,語法很重要!
編輯:正如@JonathanLeffler 指出的那樣,“模棱兩可”是一個糟糕的詞選擇,因為它定義的行為 * 的優先級低於 []
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句