如何在malloc分配的数组中正确存储数值?程序输出重复同一输入值
问题分析与修复
先看你代码里的几个关键错误:
- printf语法与逻辑错误:
printf("%d", &x]);这里多了一个多余的右方括号,而且你打印的是x的内存地址(&x),不是输入的实际数值。正确写法是printf("%d\n", x);(加换行符让输出更清晰)。 - 数组赋值逻辑错误:
*(w + x) = count;这行是把count的值存入w数组下标为x的位置。如果输入的x重复,就会不断覆盖同一个数组元素,导致后续查看数组时看到重复值;如果输入的x超出0~9999的范围,还会触发数组越界,引发程序崩溃、数据乱码等未定义行为。
根据你的需求“使用count变量将数值存入w数组”,应该是按输入顺序把数值依次存入数组,也就是用count作为数组下标,把输入的x存进去,写法是*(w + count) = x;或者更直观的w[count] = x;。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *w = malloc(sizeof(int) * 10000); // 检查内存分配是否成功,避免空指针访问 if (w == NULL) { fprintf(stderr, "内存分配失败\n"); return 1; } int x; int count = 0; while (scanf("%d", &x) == 1 && count < 10000) { // 限制count范围,防止数组越界 printf("%d\n", x); w[count] = x; // 按输入顺序存入数组 count++; } // 可选:打印数组内容验证结果 printf("数组内容:"); for (int i = 0; i < count; i++) { printf("%d ", w[i]); } printf("\n"); free(w); w = NULL; return 0; }
额外说明
- 增加了
malloc的空指针检查,这是C语言编程的良好习惯,避免内存分配失败后访问空指针。 - 循环中添加
count < 10000的判断,防止输入超过10000个数值导致数组越界。 - 用
w[count]代替*(w + count),代码可读性更强,两者在功能上完全等价。
内容的提问来源于stack exchange,提问作者Oloyede Adejayan
相关产品推荐
相关产品推荐

