C索引到指向数组的双指针会导致崩溃



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

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

产生期望的CCD_ 3输出。原来语法很重要!

编辑:正如@JonathanLeffler所指出的;含糊的";是一个糟糕的单词选择,因为它定义的行为*的优先级低于[]

最新更新