有没有遇到过这种情况?你刚写完一段数组操作的代码,运行时突然报错说”数组越界”,然后整个程序直接崩溃。这时候你盯着屏幕上的方括号发愣:明明定义了5个元素的数组,怎么循环到第6次才出错?问题的关键就在于——你真的看清楚数组的长度了吗?
先来搞清楚什么是数组长度。简单来说,它就像快递柜的格子数。假设你租了个有10个格子的快递柜(int package[10]),那这个10就是数组长度。但现实中我们常常遇到这种情况:快递员往第11个不存在的格子里塞包裹,结果整个柜子都报错——这就是数组越界的典型场景。
新手最容易犯的三个错误: 1. 肉眼数数法:直接盯着代码里的方括号数数,结果数错位数 2. 循环条件写死:在for循环里固定写i<5,后来数组扩容时忘记改条件 3. 指针混淆:把数组名当普通指针用,导致计算长度时出错
最靠谱的测量工具其实是sizeof运算符。这个方法就像是给快递柜做全身扫描: c int arr[5] = {1,2,3,4,5}; int length = sizeof(arr)/sizeof(arr[0]); 这里有个坑要注意:sizeof计算的是整个数组占用的字节数。比如int数组每个元素占4字节,5个元素就是20字节。用总字节数20除以单个元素字节数4,得到的就是真实的元素个数5。
那为什么有时候这个方法会失灵?比如下面这个函数: c void printArray(int arr[]){ int len = sizeof(arr)/sizeof(arr[0]); // 这里会出错! } 因为当数组作为参数传递时,其实传递的是指针。这时候sizeof(arr)得到的是指针的大小(通常4或8字节),而不是整个数组的大小。这就好比把快递柜的钥匙给别人,别人拿着钥匙也猜不出柜子有多大。
遇到动态数组怎么办?比如用malloc创建的数组: c int *dynamicArr = malloc(5 * sizeof(int)); 这时候sizeof可不管用了,因为dynamicArr本质上是个指针。这种情况必须手动记录数组长度,就像给快递柜贴上便签纸写明格子数量。
字符串数组是个特例。比如char str[] = “hello”;看似有5个字母,但实际上数组长度是6(包含结尾的’\0’)。这时候用strlen(str)会得到5,但sizeof(str)会得到6——这个差异经常让新手栽跟头。
小编观点:与其纠结各种特殊情况,不如先把固定长度数组的sizeof用法练熟。记住那个黄金公式sizeof(arr)/sizeof(arr[0]),就像记住自家快递柜的密码。等真正理解数组和指针的区别后,再挑战动态数组也不迟。
本站文章由SEO技术博客撰稿人原创,作者:阿君创作,如若转载请注明原文及出处:https://www.ainiseo.com/hosting/17450.html