指针遍历数组时输出结果超出数组元素数量的技术问题
C数组遍历越界问题分析与解决方案
原代码
#include<stdio.h> void function(int*); int main(){ int num[]={-3,8,12,90}; function(num); } void function(int* array){ for(;*array!='\0';array++) printf("\n%d",*array); }
问题成因
这段代码试图靠检测指针指向的元素是否为'\0'(即整数0)来终止数组遍历,但存在两个核心问题:
- 目标数组
num的4个元素里没有0,也没在末尾显式添加用作终止标志的0; - C语言数组本身不自带终止符,当指针遍历完数组的所有元素后,会继续访问数组后面的栈内存(数组存在栈上),直到找到值为0的内存单元才停止。你看到多输出4个元素,是刚好数组后续的栈内存存在4个连续的0,属于越界访问的巧合结果。
解决方案
方案1:传递数组长度(最安全通用)
直接把数组的元素个数传给函数,明确遍历范围,彻底避免越界:
#include<stdio.h> // 新增长度参数 void function(int* array, int len); int main(){ int num[]={-3,8,12,90}; // 计算数组长度:总字节数/单个元素字节数 int len = sizeof(num)/sizeof(num[0]); function(num, len); } void function(int* array, int len){ for(int i=0; i<len; i++) printf("\n%d", array[i]); }
方案2:添加哨兵终止元素
如果能确定数组元素不会出现0,可以在数组末尾加0作为终止标志,适配原函数的遍历逻辑:
#include<stdio.h> void function(int*); int main(){ // 末尾添加0作为终止符 int num[]={-3,8,12,90, 0}; function(num); } void function(int* array){ for(;*array!=0; array++) printf("\n%d",*array); }
这里把
'\0'改成0更直观,'\0'本质就是ASCII值为0的字符,用在int数组里语义一致,但写0更符合整数数组的代码风格。
方案3:指针范围判定遍历
和方案1逻辑一致,用指针的起始和结束范围来控制遍历:
#include<stdio.h> void function(int* array, int len); int main(){ int num[]={-3,8,12,90}; int len = sizeof(num)/sizeof(num[0]); function(num, len); } void function(int* array, int len){ int* end = array + len; for(; array < end; array++) printf("\n%d",*array); }
内容的提问来源于stack exchange,提问作者Devesh from India
相关产品推荐
相关产品推荐

