【问题标题】:C Indexing into double pointer to array causes crashC索引到数组的双指针会导致崩溃
【发布时间】:2021-12-27 17:06:16
【问题描述】:

我有以下简化的代码来为另一个函数的数组分配空间和赋值,通过指向数组的指针传入。索引到取消引用的指针时会导致崩溃:

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)。我正在做的事情的逻辑似乎很合理,所以我不知道该怎么办。

【问题讨论】:

    标签: arrays c malloc dereference


    【解决方案1】:

    问题原来是模棱两可:虽然代码的逻辑是合理的,但在崩溃的那一行我解释为“取消引用,然后访问第 i 个元素”,但编译器显然解释为“访问第 i 个元素,然后取消引用”。事实上,使用括号明确说明我的意图解决了这个问题:更改为

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

    产生所需的0 1 2 输出。事实证明语法很重要!

    编辑:正如@JonathanLeffler 指出的那样,“模棱两可”是一个糟糕的词选择,因为它的定义行为 * 的优先级低于 []

    【讨论】:

    • 与其说是“运算符优先级”不如说是模棱两可。原始代码在此上下文中是明确但不正确的(因为运算符优先级);在其他情况下,它会是明确和正确的。前缀 * 的优先级低于下标操作,而您使用括号覆盖优先级的解决方案确实可以解决问题。
    • 感谢您的澄清!我将对其进行编辑以反映这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多