C语言对指向数组的双指针索引访问导致崩溃如何解决
问题根因
- 崩溃由运算符优先级使用错误导致:C语言中,下标运算符
[]优先级高于解引用运算符*,你写的*arr[i]实际执行逻辑是*(arr[i]),和你预期的先解引用二级指针再访问数组下标的逻辑完全不符。 - 你传入的
arr是指向main函数中main_arr变量的二级指针,本身只对应1个合法的指针内存地址,当循环中i>=1时,arr[i]已经是访问非法栈内存,对其解引用直接触发段错误。
修复方案
修改foo函数中循环内的赋值语句,显式加括号控制运算优先级:
void foo(int **arr) { int num_elements = 3; *arr = malloc(num_elements*sizeof(int)); // 附加最佳实践:判断malloc返回值,避免分配失败时访问空指针 if (*arr == NULL) { perror("malloc申请内存失败"); return; } for(int i=0; i<num_elements; i++){ (*arr)[i] = i; // 先解引用二级指针拿到数组首地址,再做下标访问 } }
修改后程序即可正常输出预期结果0 1 2 。
内容的提问来源于stack exchange,提问作者MANA624
相关产品推荐
相关产品推荐

