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

使用C语言realloc()函数时出现逻辑错误的问题排查

动态内存分配中realloc导致垃圾值的问题分析

我在C语言中用动态内存分配处理一个简单问题:需要获取用户输入的两个数组元素,计划先初始化大容量数组,输入完成后用realloc()缩小容量。但运行时realloc()会覆盖已输入元素并填充垃圾值,代码如下:

void arrayop()
{
    int val, i=0;
    int *arr1 = (int*) calloc(100,sizeof(int));
    int *arr2 = (int*) calloc(100,sizeof(int));
    printf("Enter first array:(-1 to stop)\n");
    while(val!=-1)
    {
        if(val != -1)
        {
            scanf("%d",&val);
            *(arr1 + i) = val;
            i++;
        }
    }
    //printf("\t%d\n",i);

    arr1 = (int*)realloc(arr1,(i));
    //printf("\t%d\n",(sizeof(arr1)));
    for(int j=0;j<i;j++)
    {
        printf("%d ",*(arr1 + j));
    }
    printf("\n");
}

问题原因

  • val未初始化就参与循环判断:val是局部变量,默认未初始化,初始值为随机垃圾值。如果这个初始值恰好是-1,循环直接不执行;若不是,后续逻辑也会因初始值的随机性出现异常。

  • realloc的内存大小参数错误:realloc的第二个参数要求传入总字节数,你仅传入了元素个数i,而非i * sizeof(int)。比如i=3时,仅分配3字节,而一个int通常占4字节,实际分配的空间连1个完整的int都装不下,后续访问数组必然越界,读取到垃圾值。

  • 输入逻辑顺序错误:当前代码会把终止符-1也存入数组,且i会多计数一次。流程是先判断val!=-1,再读取值、存入数组、i++,导致最后输入的-1被存在数组里,i的数值比实际有效元素个数多1,进一步加剧内存越界问题。

修正后的代码示例

void arrayop()
{
    int val, i=0;
    int *arr1 = calloc(100, sizeof(int));
    int *arr2 = calloc(100, sizeof(int));
    
    printf("Enter first array:(-1 to stop)\n");
    // 先读取第一个值,再判断是否进入循环
    scanf("%d", &val);
    while(val != -1)
    {
        arr1[i] = val;
        i++;
        scanf("%d", &val);
    }

    // 重新分配内存,传入正确的字节数
    int *temp = realloc(arr1, i * sizeof(int));
    // 检查realloc是否成功(避免内存分配失败导致原指针丢失)
    if(temp != NULL)
    {
        arr1 = temp;
    }

    for(int j=0; j<i; j++)
    {
        printf("%d ", arr1[j]);
    }
    printf("\n");

    // 释放动态分配的内存,避免内存泄漏
    free(arr1);
    free(arr2);
}

内容的提问来源于stack exchange,提问作者Sharvansh Shukla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:45:37