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

使用realloc的while循环打印时无法更新数组

动态内存扩容后打印异常?帮你搞定!

嘿,看你遇到的问题——代码能编译,但输入Y循环一次后,打印数字列表只显示一个0.00000,完全没达到扩容后更新列表的预期对吧?我帮你分析下大概率出问题的地方,再给你修正后的代码。

先说说可能踩的坑

你遇到的现象,基本逃不开这几个常见错误:

  • 直接用原指针接realloc的返回值:如果realloc扩容失败会返回NULL,直接赋值给原指针会把之前的内存地址搞丢,数据直接损坏,还会内存泄漏。
  • 计数变量没同步更新:要是你用来记录数组元素个数的变量(比如count)没在每次加元素后递增,打印循环的边界就只会遍历第一个元素,自然只显示一个数。
  • 输入字符时没处理换行符:用scanf读数字后,输入缓冲区会留个换行符,之后读Y/N的时候会直接读这个换行符,导致循环直接终止,看起来就像只执行了一次。
  • 初始内存分配后的赋值或计数错了:第一次分配内存后,要是没给元素赋值或者计数没设对,也会打印出初始的0.0。

给你修正后的完整代码

我把这些坑都填上了,你可以直接参考:

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

int main() { 
    double *user_nums = NULL;
    int current_count = 0;
    char continue_choice;

    do {
        // 安全扩容内存,每次多存一个double类型的数据
        int new_size = current_count + 1;
        double *temp_ptr = realloc(user_nums, new_size * sizeof(double));
        
        if (temp_ptr == NULL) {
            fprintf(stderr, "内存分配失败,程序退出\n");
            free(user_nums); // 先释放已分配的内存,避免泄漏
            return EXIT_FAILURE;
        }
        user_nums = temp_ptr;

        // 读取用户输入的数字
        printf("请输入一个浮点数:");
        if (scanf("%lf", &user_nums[current_count]) != 1) {
            fprintf(stderr, "输入无效,请输入正确的数字\n");
            free(user_nums);
            return EXIT_FAILURE;
        }
        current_count++; // 计数递增,记录当前元素总数

        // 询问是否继续,注意跳过输入缓冲区的换行符
        printf("是否继续添加数字?(Y/N):");
        scanf(" %c", &continue_choice); // 前面的空格会跳过换行、空格等空白字符

        // 打印所有已输入的数字
        printf("当前已输入的数字列表:\n");
        for (int i = 0; i < current_count; i++) {
            printf("%.5f\n", user_nums[i]); // 保留5位小数,显示更清晰
        }
        printf("------------------------\n");

    } while (continue_choice == 'Y' || continue_choice == 'y');

    // 程序结束前释放动态分配的内存
    free(user_nums);
    printf("程序结束,内存已释放\n");
    return EXIT_SUCCESS;
}

为啥这么改?

  • 用临时指针temp_ptr接收realloc的结果,验证成功后再赋值给原指针,彻底避免内存丢失的问题;
  • 每次输入数字后立刻递增current_count,确保打印循环能遍历所有已添加的元素;
  • 读取Y/N时加了空格,跳过之前输入留下的换行符,不会误判终止循环;
  • 增加了输入有效性检查,防止用户输入非数字导致程序异常。

你运行这个代码试试,每次输入Y都会正常扩容并显示所有已输入的数字,应该就能解决你的问题啦!

内容的提问来源于stack exchange,提问作者Santiago David Aguirre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:49