C语言向函数传递数组指针realloc后访问下标1触发段错误问题
问题产生原因
该问题由C语言运算符优先级规则触发非法内存访问导致:
- C语言中,下标运算符
[]的优先级高于解引用运算符*,你写的*array[1]不会按照你预期的逻辑执行:
你预期的逻辑是:先对二级指针array解引用拿到数组首地址,再取下标偏移1的元素,但编译器实际的执行顺序是:先对array做下标偏移,取array + 1地址存储的值,再对这个值做解引用。array是指向main函数中array指针变量的二级指针,array + 1对应的是array指针变量相邻的未申请内存,对这块内存做写入操作就会触发segmentation fault。 - 第一段代码能正常运行纯属巧合:
*array[0]等价于*(array[0]),刚好和你预期的(*array)[0]执行结果一致,刚好访问到数组第一个元素,没有触发非法访问。
修复方案
修改元素赋值语句,用括号明确优先级即可,同时建议增加realloc失败的判断逻辑,避免内存泄漏:
void fun(int **array, int *size) { // 不要直接把realloc返回值赋值给原指针,避免失败后原指针丢失 int *new_array = realloc(*array, *size * sizeof(int)); if (new_array == NULL) { // 可自行添加错误处理逻辑 return; } *array = new_array; // 加括号明确先解引用二级指针,再取下标 (*array)[0] = 1; (*array)[1] = 2; return; } int main() { int size = 5; int *array = malloc(2 * sizeof(int)); fun(&array, &size); // 后续记得释放array避免内存泄漏 free(array); return 0; }
内容的提问来源于stack exchange,提问作者Michalo
相关产品推荐
相关产品推荐

