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

指针遍历数组时输出结果超出数组元素数量的技术问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:25:29