C语言字符串数组内存重分配resize函数是否可以简化?
简化方案说明
现有实现使用三级指针确实可读性较差,以下是两种常用的优化思路:
方案1:使用结构体封装动态数组(最推荐)
将字符串数组的数据指针、容量、当前元素数封装为统一结构体,从根源上避免多级指针和多参数传递的问题,也是工业界C语言实现动态数组的标准方案:
// 定义字符串动态数组结构体 typedef struct { char** data; // 存储字符串指针的数组 int size; // 当前已存储的元素个数 int capacity; // 当前分配的总容量 } StrArr; // 扩容函数仅需传入结构体指针 void StrArr_resize(StrArr* arr) { arr->capacity *= 2; char** new_data = realloc(arr->data, sizeof(char*) * arr->capacity); nulltest(new_data); arr->data = new_data; }
调用方式非常简洁,不存在多级指针:
// 初始化示例 StrArr arr = { .data = NULL, .size = 0, .capacity = 2 // 初始容量可自定义 }; // 扩容调用 StrArr_resize(&arr);
该方案的优势是数组状态统一管理,不会出现容量和数据指针不同步的问题,可维护性最高。
方案2:修改函数返回值减少指针层级(适配现有代码结构)
如果不想调整现有代码的整体结构,可以通过返回新数组指针的方式去掉三级指针,仅需调整函数定义和调用逻辑:
char** resize(int* size, char** arr) { int new_cap = *size * 2; char** new_arr = realloc(arr, sizeof(char*) * new_cap); nulltest(new_arr); *size = new_cap; return new_arr; }
调用方式改为接收返回值即可:
arr = resize(&size, arr);
注意:该方案存在风险,如果调用时忘记将返回值赋值给原数组指针,会导致内存泄漏和野指针问题,不推荐新手使用
现有实现的隐性问题修复
你当前的实现存在内存泄漏风险:如果realloc分配失败返回NULL,会直接覆盖原数组指针,导致原有内存地址丢失无法释放。建议调整分配逻辑,先临时存储新指针,校验通过后再赋值:
// 修复后的原逻辑版本 void resize(int* size, char*** arr) { int new_size = *size * 2; char** new_arr = realloc(*arr, sizeof(char*) * new_size); nulltest(new_arr); *size = new_size; *arr = new_arr; }
内容的提问来源于stack exchange,提问作者brczmrk
相关产品推荐
相关产品推荐

