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

C语言打印数组输出多余值:原因分析与修复方案

数组越界访问的问题分析与修复方案

Hey,这个问题我刚入门C语言的时候也踩过一模一样的坑!咱们来一步步拆解问题:

问题根源

你现在用sizeof(array)来获取数组的长度,这其实是个误区——sizeof运算符返回的是整个数组占用的内存字节数,而不是数组的元素个数。

在大多数系统中,int类型占用4个字节,你的数组array有4个元素,所以sizeof(array)的结果是 4 * 4 = 16。这就导致你的循环会执行16次,但数组只有前4个位置是你初始化的有效值,剩下的12次循环都是在访问数组边界之外的内存区域——这些内存里存的是程序运行时的随机垃圾值,所以你才会看到一堆莫名其妙的数字输出。

修复方法

要得到数组的真实元素个数,你需要用数组总字节数除以单个元素的字节数,也就是用 sizeof(array) / sizeof(array[0]):

  • sizeof(array) 是数组整体的字节数
  • sizeof(array[0]) 是数组中单个元素的字节数
  • 两者相除就能精准得到元素的数量

修复后的代码如下:

#include <cs50.h>
#include <stdio.h>
int main (void) {
    int array[]={1,2,3,7};
    // 正确计算数组元素个数
    int len = sizeof(array) / sizeof(array[0]);
    for(int i=0; i < len; i++) {
        printf("%i\n",array[i]);
    }
}

小提醒

如果后续你需要把数组传递给函数,这个方法就失效了——因为数组作为函数参数时会退化为指针,sizeof得到的只是指针的字节数,而不是数组的总字节数。这种情况下你需要手动把数组长度作为参数传递给函数。

内容的提问来源于stack exchange,提问作者Mr.Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:08:11