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
相关产品推荐
相关产品推荐

