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

C语言函数中使用realloc、calloc扩容2D数组触发段错误如何解决

问题解答

传参方式正确性

你使用char***传参的方式是正确的。C语言函数参数为值传递,要在函数内部修改main函数中char**类型的指针变量data的值,必须传入该变量的地址,三级指针的写法完全符合语法要求。

核心问题原因

问题出在运算符优先级错误:
C语言中,下标运算符[]的优先级高于解引用运算符*,你写的*data[1]会被编译器解析为*(data[1]),而非你预期的(*data)[1]。
data是指向main函数中data变量的三级指针,data[1]本质是访问了main函数中data变量所在栈地址之后的非法内存,对这块非法内存解引用、赋值都会触发段错误。

修复方案

只需要修改increase函数中给第二行字符串分配空间的代码,加括号调整运算顺序即可,额外补充realloc失败的判空逻辑避免内存泄漏:

void increase(char*** data)
{
    // 先用临时变量接收realloc返回值,避免分配失败丢失原指针
    char** tmp = realloc(*data, 2 * sizeof (char*));
    if (tmp == NULL) {
        perror("realloc failed");
        return;
    }
    *data = tmp;
    // 加括号调整优先级,先解引用拿到char**再取下标
    (*data)[1] = calloc(5, sizeof(char));
}

额外优化建议

你当前的代码存在内存泄漏问题:释放内存时需要先释放每个字符串的堆空间,再释放指针数组的空间,正确释放逻辑如下:

// main函数结束前的释放逻辑
free(data[0]);
free(data[1]);
free(data);

实际生产使用中建议把当前的元素个数、单字符串最大长度封装成结构体管理,扩容时更易维护。


内容的提问来源于stack exchange,提问作者David9472

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:03