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
相关产品推荐
相关产品推荐

