C 索引到數組的雙指針會導致崩潰

MANA624

我有以下簡化代碼來為另一個函數的數組分配空間和賦值,該函數通過指向數組的指針傳入。索引到解除引用的指針時會導致崩潰:

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)我正在做的事情的邏輯似乎很合理,所以我不知道該怎麼辦。

MANA624

結果證明這個問題是模棱兩可的:雖然代碼的邏輯是合理的,但在崩潰的那一行我解釋為“取消引用,然後訪問第 i 個元素”,但編譯器顯然解釋為“訪問第 i 個元素” ,然後取消引用”。事實上,使用括號明確說明我的意圖解決了這個問題:更改為

    for(int i=0; i<num_elements; i++)
        (*arr)[i] = i

產生所需的0 1 2 輸出。事實證明,語法很重要!

編輯:正如@JonathanLeffler 指出的那樣,“模棱兩可”是一個糟糕的詞選擇,因為它定義的行為 * 的優先級低於 []

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

為什麼當我嘗試重新分配()結構的指針數組時,我的 C 程序會崩潰?

c中結構指針內的雙數組

c++ 將指針推入指針優先級隊列會導致立即 valgrind 錯誤

如何在C中復制雙指針數組?

從 c 或 c++ 中的指針差異獲取數組索引

帶類的 C++ 數組函數指針

C++中數組指針的Malloc空間

c ++ char數組到struct中的char指針

無法在 C 中打印返回數組指針的函數的輸出

將參數傳遞給鏈接的 Get 請求會導致 404 崩潰

如何僅使用指針在 C 中使用字符串數組

如何在不使用數組或 C 中的指針的情況下反向打印值

如何將 2D 指針數組傳遞給 3D 指針數組(函數和類)並在 C++ 中返回值的 3d 數組?

用指向數組的指針替換衰減的數組導致分段錯誤

將數組指針傳遞給函數,然後重新分配數組並在 C 中更改其值

C 函數中的指針需要無符號類型數組,但我的數組是有符號的

指針數組不會被打印

Nuxt.js Oauth 有時會導致整個網頁崩潰

使用 lateinit 注入存儲庫會導致崩潰

使用函數 C++ 打印結構指針

指針與整數C++比較的問題

數組索引導致越界

為什麼在我的輔助函數中取消引用指針變量會導致我的整個程序終止?

在循環一次之前,Javascript 會在 for 循環開始時導致崩潰

為什麼我的Qt程序中未執行的代碼會導致程序崩潰?

在 go 中復制指針內容會導致不必要的開銷?

C 指針複製

c - 如何在c中將不同的函數指針傳遞給atexit?

在 C 中使用指針存儲給定數量的數字