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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:44:45