C语言函数无法修改传入动态二维数组引发段错误问题求助
问题核心原因
C语言所有参数都是值传递,你想在函数内部修改外部的char**类型的变量,必须传入该变量的地址,也就是参数类型要为char***,否则函数内部修改的只是形参的副本,外部变量不会生效。
原代码的错误点
- 函数参数类型错误:原函数定义的第三个参数是
char** members,无法修改外部的members指针,需要改为char*** members。 - 调用侧初始
malloc完全多余:你要在函数内部分配数组内存,不需要提前给members分配空间,直接声明char** members;然后传&members进函数即可。 - 函数内部要通过解引用三级指针的方式操作外部的二级指针:比如分配内存的时候写
*members = malloc(xxx * sizeof(char*));。
补充Demo的错误点
你写的Demo运行出乱码的核心问题是运算符优先级错误:
C语言中[]的优先级高于*,你写的*members[i]实际等价于*(members[i]),这是完全错误的取值逻辑,你要先解引用三级指针拿到外部的二级数组,再取下标,正确写法是(*members)[i]。
另外还有两个隐藏问题:
- 字符串分配内存时长度少了1:
strlen(string)得到的是不包含末尾\0的长度,分配时要加1,即malloc((strlen(string) + 1) * sizeof(char))。 realloc直接赋值给原指针存在风险:如果realloc分配失败会返回NULL,会丢失原内存地址,建议先用临时指针接收返回值,判断非空再赋值。
修正后的Demo代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int populate(char ***members) { *members = malloc(3 * sizeof(char *)); if (*members == NULL) { return -1; } for (int i = 0; i < 3; i++) { char string[6] = "Hello"; (*members)[i] = malloc((strlen(string) + 1) * sizeof(char)); strcpy((*members)[i], string); } return 0; } int main() { char **members; populate(&members); printf("%s\n", members[0]); printf("%s\n", members[1]); printf("%s\n", members[2]); for (int i = 0; i < 3; i++) { free(members[i]); } free(members); return 0; }
原业务代码的修改方案
- 修改函数定义:
// 第三个参数改为三级指针 int getUniqueRelMembersCount(universe_t u, relation_t rel, char ***members) { int memberCount = 0; // 统计唯一成员数量逻辑... // 分配指针数组内存 *members = malloc(memberCount * sizeof(char *)); for (int i = 0; i < memberCount; i++) { // 给每个字符串分配内存、赋值的逻辑... } return memberCount; }
- 修改调用逻辑:
char **members; // 不需要提前malloc int len = getUniqueRelMembersCount(universe, relations.relations[0], &members); printf("%d\n", len); printf("%s", members[0]); // 释放逻辑保持不变 for (int i = 0; i < len; i++) { free(members[i]); } free(members);
内容的提问来源于stack exchange,提问作者DominikPetrik
相关产品推荐
相关产品推荐

