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

使用realloc扩展动态数组时实际大小超出预期的原因咨询

动态数组realloc追加内存后长度异常的问题分析

你遇到的问题是使用realloc为动态数组追加内存后,实际数组长度远大于预期的8,且出现乱码值,核心问题出在两处关键错误:

原代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, added_data;
    int *data;

    printf("Enter the total number of elements: ");
    scanf("%d", &n);

    
    data = (int *)calloc(n, sizeof(int));
    if (data == NULL)
    {
        printf("Error!!! memory not allocated.");
        exit(0);
    }

    
    for (i = 0; i < n; i++)
    {
        printf("Enter number %d: ", i + 1);
        scanf("%d", data + i);
    }

    printf("Enter number of elements to add: ");
    scanf("%d", &added_data);

    if(added_data > 0)
    {
        data = realloc(data, added_data * sizeof(int));

        for (i=0; i < added_data; i++)
        {
            //n++;
            printf("Enter number %d: ", i + 1);
            scanf("%d", data + n);
            n++;
        }
    }

    int new_length = n + added_data;
    printf("\nnew length of array: %d", new_length);
    printf("\n");

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

    printf("\n");

    free(data);

    return 0;
}

运行输出

Enter the total number of elements: 5
Enter number 1: 1
Enter number 2: 2
Enter number 3: 3
Enter number 4: 4
Enter number 5: 5
Enter number of elements to add: 3
Enter number 1: 55
Enter number 2: 99
Enter number 3: 88

new length of array: 11
1
2
3
4
5
55
99
88
10053856
0
10027344

错误分析

  1. realloc内存大小计算错误
    你调用realloc(data, added_data * sizeof(int))时,只分配了added_data个int的内存,这会把原来n个元素的内存空间缩小,导致原数组的部分数据丢失,同时后续写入新元素时会超出分配的内存范围,触发未定义行为。正确的内存大小应该是原数组长度 + 新增元素长度,即(n + added_data) * sizeof(int)。

  2. 新长度计算重复累加
    在新增元素的循环中,你已经通过n++把原长度5更新为8(5+3),但后续计算new_length = n + added_data时,又把8和3相加得到11,这完全错误。实际新长度就是更新后的n,或者直接用原n + added_data,不需要重复累加。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, added_data;
    int *data;

    printf("Enter the total number of elements: ");
    scanf("%d", &n);

    data = (int *)calloc(n, sizeof(int));
    if (data == NULL)
    {
        printf("Error!!! memory not allocated.");
        exit(0);
    }

    for (i = 0; i < n; i++)
    {
        printf("Enter number %d: ", i + 1);
        scanf("%d", data + i);
    }

    printf("Enter number of elements to add: ");
    scanf("%d", &added_data);

    if(added_data > 0)
    {
        // 修正:分配原长度+新增长度的内存
        int *temp = realloc(data, (n + added_data) * sizeof(int));
        // 注意:realloc可能失败,建议用临时指针接收,避免原指针丢失
        if(temp == NULL) {
            printf("Error!!! realloc failed.");
            free(data);
            exit(0);
        }
        data = temp;

        for (i=0; i < added_data; i++)
        {
            printf("Enter number %d: ", n + i + 1);
            scanf("%d", data + n + i);
        }
        // 更新数组总长度
        n += added_data;
    }

    printf("\nnew length of array: %d", n);
    printf("\n");

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

    printf("\n");

    free(data);

    return 0;
}

另外补充一个细节:直接用data = realloc(data, ...)存在风险,如果realloc失败返回NULL,会导致原内存指针丢失,无法释放。所以建议用临时指针接收realloc的返回值,确认成功后再赋值给原指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:32:09