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

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;
}

修复说明

  1. 简化了appendInTheEnd的入参,仅保留二级指针array,追加元素时直接操作(*array)[size],永远取最新的数组地址,避免野指针问题。
  2. 将追加元素的逻辑移出扩容判断分支,无论是否触发扩容都会执行追加操作,符合接口语义。
  3. 修正resizeArray中memset的字节长度参数,删除冗余的for循环初始化逻辑。
  4. 补充了必要的头文件引入、函数前置声明、内存释放逻辑,符合C语言开发规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:54:04