C语言数组打印出现垃圾值求助:如何用while循环正确终止
问题分析与解决方法
咱们先拆解下你遇到的问题:你的while(arr[i])循环是靠数组元素是否为非零来判断要不要继续执行的,但你定义的数组里所有元素都是非零的,所以循环会一直越过数组的边界,去读取内存里的垃圾数据,直到碰巧读到一个0才会停下来——这就是你看到一堆奇怪数值的原因。
要解决这个问题,用while循环正确遍历数组并在末尾终止,有两种常用的方法:
方法1:传递数组长度给函数(推荐)
在C语言里,数组作为函数参数时会退化为指针,函数内部没法直接获取数组的真实长度。所以我们需要手动把数组长度传递给打印函数,用长度来控制循环终止。
修改后的完整代码如下:
#include <stdio.h> // 调整函数声明,增加长度参数 void arraySize(int arr[], int size); int main() { int array[] = {15, 50, 34, 20, 10, 79, 100}; // 计算数组长度:总字节数 ÷ 单个元素的字节数 int arrLength = sizeof(array) / sizeof(array[0]); // 调用时传入数组和长度 arraySize(array, arrLength); return 0; } void arraySize(int arr[], int size) { int i = 0; // 用索引小于数组长度作为循环条件 while(i < size) { printf("The value of arr[%d] is %d \n", i, arr[i]); i++; } }
方法2:使用哨兵值(有局限性)
如果你的数组元素本身不会包含某个特定值(比如0),可以在数组末尾加上这个“哨兵值”,让循环遇到它时终止。比如给数组最后加个0:
#include <stdio.h> void arraySize(int arr[]); int main() { // 末尾添加哨兵值0 int array[] = {15, 50, 34, 20, 10, 79, 100, 0}; arraySize(array); return 0; } void arraySize(int arr[]) { int i = 0; // 遇到0就终止循环 while(arr[i]) { printf("The value of arr[%d] is %d \n", i, arr[i]); i++; } }
⚠️ 注意:这种方法只能用在数组元素绝对不会出现哨兵值的场景,如果你的数组里本来就有0,循环会提前终止,所以更推荐第一种传递长度的方法。
内容的提问来源于stack exchange,提问作者B.Balamanigandan
相关产品推荐
相关产品推荐

