C语言动态扩容数组append功能异常 新插入值未写入问题
问题根因
- 核心错误:
appendInTheEnd函数的第一个参数arr是值传递,扩容操作执行后resizeArray修改了二级指针指向的新内存地址,但函数内的局部变量arr仍然指向已经被free释放的旧数组地址。执行arr[size] = value实际是写入已释放的野内存,新分配的数组完全没有被修改,因此看不到追加的新值。 - 逻辑错误:当前
appendInTheEnd仅在数组满容触发扩容时才会执行追加逻辑,若数组未满调用该接口不会执行任何操作,不符合append接口的通用语义。 - 隐性错误:
resizeArray中的memset使用错误,memset按字节赋值,传入的第三个参数capacity单位为字节,要初始化capacity个int元素,实际需要的字节长度为capacity * sizeof(int),当前写法仅能初始化1/4的目标区域,仅因为之前冗余的for循环赋值才没有触发问题。
修复代码
#define EMPTY -1 #include <stdio.h> #include <stdlib.h> #include <string.h> size_t capacity = 4; int size = 0; void resizeArray(int **arr, size_t old_capacity); void appendInTheEnd(int **array, int value); int main(void) { int *arr = malloc(capacity * sizeof(int)); arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; size = 4; appendInTheEnd(&arr, 5); for (int i = 0; i < capacity; i++) { printf("%d ", arr[i]); } free(arr); return 0; } void appendInTheEnd(int **array, int value) { if (size == capacity) { resizeArray(array, capacity); capacity *= 2; } (*array)[size] = value; size++; } void resizeArray(int **arr, size_t old_capacity) { int *newArr = malloc(2 * old_capacity * sizeof(int)); memcpy(newArr, *arr, old_capacity * sizeof(int)); memset(newArr + old_capacity, EMPTY, old_capacity * sizeof(int)); free(*arr); *arr = newArr; }
修复说明
- 简化了
appendInTheEnd的入参,仅保留二级指针array,追加元素时直接操作(*array)[size],永远取最新的数组地址,避免野指针问题。 - 将追加元素的逻辑移出扩容判断分支,无论是否触发扩容都会执行追加操作,符合接口语义。
- 修正
resizeArray中memset的字节长度参数,删除冗余的for循环初始化逻辑。 - 补充了必要的头文件引入、函数前置声明、内存释放逻辑,符合C语言开发规范。
内容的提问来源于stack exchange,提问作者Lorenzo Battistela
相关产品推荐
相关产品推荐

