C语言中未预先指定数组大小时能否初始化整数数组?如何将未赋值的整数数组元素自动置0?
这个问题其实很好解决,核心思路就是先把整个数组的所有元素初始化为0,再处理用户输入——这样不管用户输入多少个有效整数,剩下没被覆盖的元素本来就是0,完全不会有垃圾值的问题。下面分两种场景具体说:
一、固定大小的数组(比如你例子里的number[5])
你原来的代码问题在于,局部声明的数组默认不会初始化,里面全是垃圾值;而且用for循环强制执行n次scanf,如果用户输入不够,剩下的元素还是垃圾值。改成下面的写法就搞定了:
#include <stdio.h> int main() { int n = 5; // 关键:用{0}初始化,C标准会把数组所有元素自动设为0 int number[5] = {0}; int count = 0; // 循环读取输入,直到读满n个,或者用户输入结束/出错 while (count < n && scanf("%d", &number[count]) == 1) { count++; } // 打印验证:前count个是用户输入,后面的都是0 for (int i = 0; i < n; i++) { printf("number[%d] = %d\n", i, number[i]); } return 0; }
为什么这样有效?因为int number[5] = {0};是C语言的初始化语法:只要初始化列表里至少有一个值,剩下未指定的元素都会被自动初始化为0。之后用while循环读取输入,每成功读一个整数,count就加一——如果用户只输入3个,循环就会提前结束,剩下的number[3]、number[4]本来就是0,完全不用额外处理。
如果是全局数组或者用static修饰的局部数组,它们会被自动初始化为0,但我还是建议显式写{0},代码可读性更强,别人一看就知道你是故意要初始化为0的。
二、未预先指定大小的动态数组
如果不想一开始就固定数组大小,想更灵活(比如允许用户输入最多10个,但实际输入多少都行),可以用动态内存分配,这里推荐用calloc函数——它在分配内存的同时,会把所有字节都置为0,对于整数来说就是0值:
#include <stdio.h> #include <stdlib.h> int main() { int max_size = 10; // 设定允许的最大输入个数 // calloc分配max_size个int的内存,并且自动初始化为0 int *number = calloc(max_size, sizeof(int)); if (number == NULL) { // 一定要检查内存分配是否成功 printf("内存分配失败!\n"); return 1; } int count = 0; while (count < max_size && scanf("%d", &number[count]) == 1) { count++; } // 验证输出 for (int i = 0; i < max_size; i++) { printf("number[%d] = %d\n", i, number[i]); } free(number); // 动态分配的内存一定要记得释放 return 0; }
如果你习惯用malloc,那分配完内存后需要手动用memset把数组置0:
int *number = malloc(max_size * sizeof(int)); if (number != NULL) { memset(number, 0, max_size * sizeof(int)); // 把所有元素置为0 }
这样不管用户输入几个,剩下的元素都是0,完全不会有垃圾值的问题。
额外提醒
如果你用的是C99及以后的标准,还可以用变长数组(VLA),比如用户先输入n的值,再声明数组——不过变长数组不能用初始化列表,所以这种情况得用memset来初始化:
int n; printf("请输入数组最大大小:"); scanf("%d", &n); int number[n]; memset(number, 0, n * sizeof(int)); // 手动置0
这样也能达到同样的效果。
内容的提问来源于stack exchange,提问作者Afif Al'Hasnain

