C索引到指向数组的双指针会导致崩溃
C Indexing into double pointer to array causes crash
我有以下简化代码来分配 space 并从另一个函数为数组赋值,通过指向数组的指针传入。索引到取消引用的指针时导致崩溃:
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 指出的那样,“模棱两可”是一个糟糕的词选择,因为它定义的行为 * 的优先级低于 []
我有以下简化代码来分配 space 并从另一个函数为数组赋值,通过指向数组的指针传入。索引到取消引用的指针时导致崩溃:
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 指出的那样,“模棱两可”是一个糟糕的词选择,因为它定义的行为 * 的优先级低于 []