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

C语言自动扩容数组失效:realloc未保留原有数据原因咨询

问题分析:自动扩容数组数据丢失的原因

嘿,我一眼就看到问题所在了——你在使用realloc的时候犯了一个非常经典的错误!

核心问题:未接收realloc的返回值

realloc的工作逻辑是这样的:当你要求扩容内存时,如果当前内存块的后续空间足够,它会直接在原地址扩展空间并返回原地址;但如果后续空间不足,它会在内存的其他区域开辟一块新的、更大的空间,把原有数据复制到新空间,然后释放旧的内存块,最后返回新空间的地址。

而你的代码里只是调用了:

(int*) realloc(p, n * 2 * sizeof(int));

却没有把这个返回值赋值给p!这就导致p仍然指向已经被realloc释放的旧内存地址,后续对p的读写操作都是在已经被回收的内存上进行的,这属于未定义行为,直接表现就是原有数据丢失、出现随机乱码(比如你输出里的1990352、0这类奇怪数值)。

修复方案

你需要把realloc的返回值赋值给p,而且为了避免内存分配失败导致的空指针问题,最好先把返回值存在临时变量里,检查不为空后再更新p:

修正后的关键代码片段:

if (i == n / 2) {
    // 先把realloc的返回值存到临时变量
    int *temp = (int*) realloc(p, n * 2 * sizeof(int));
    // 检查内存分配是否成功
    if (temp == NULL) {
        printf("内存分配失败!");
        free(p); // 释放原有内存,避免泄漏
        exit(1);
    }
    p = temp; // 更新p到新的内存地址
    n = n * 2;
}

同时,建议你也给初始的malloc加上返回值检查,避免空指针访问:

int *p = (int*) malloc(n * sizeof(int));
if (p == NULL) {
    printf("初始内存分配失败!");
    exit(1);
}

补充小细节

还有一个可以优化的点:getchar()可能会读取到输入中的空格、制表符等非换行字符,导致循环提前终止?不过这不是你当前数据丢失的核心原因。如果你想确保读取完一行所有整数,可以考虑用scanf的返回值来判断输入是否有效,或者统一处理掉所有非数字的空白字符。

内容的提问来源于stack exchange,提问作者蒋浩楠

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:09:08