You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:04