使用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
相关产品推荐
相关产品推荐

