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

为何int数组越界输出垃圾值,char数组却能正常遍历?

为什么int数组遍历会越界输出垃圾值,char数组却能正常终止?

遍历int数组和char数组时,发现int数组无论是下标还是指针遍历都会越界输出垃圾值,但char数组能正确终止输出——虽然误以为没加'\0',但实际代码里是包含的。以下是相关代码和输出:

char数组代码

char name[7] = {'R','a','s','h','m','I','\0'};
int i=0;
while(name[i])
{
    printf("value of a = %c \n",name[i]);
    i++;
}

char数组输出

value of a = R 
value of a = a 
value of a = s 
value of a = h 
value of a = m 
value of a = I 

int数组代码

int a[5]={1,2,3,4,5};
int *p,i=0;     
p=a;    

while(a[i])
{
    printf("value of a = %d \n",a[i]);
    i++;
}


while(*p)
{
    printf("value of p = %d \n",*p);
    p++;
}

int数组输出

value of a = 1 
value of a = 2 
value of a = 3 
value of a = 4 
value of a = 5 
value of a = 5 
value of a = 6487552 
value of p = 1 
value of p = 2 
value of p = 3 
value of p = 4 
value of p = 5 
value of p = 7 
value of p = 6487576 

问题根源

  • char数组能正常终止,是因为你在数组末尾加了'\0'(它的ASCII值是0)。while(name[i])的逻辑是“元素值不为0就继续循环”,当遍历到'\0'时,条件不成立,循环直接停止,不会越界访问后面的内存。
  • int数组的问题在于,数组里的元素1到5全是非0值。当遍历完最后一个元素后,i还会继续加1、指针p也会继续往后挪,这时候访问的是数组外面的内存区域,里面存的都是随机垃圾值。只要这些垃圾值不是0,循环就会一直跑,直到碰巧遇到一个值为0的内存位置才会停——你看到的额外输出就是这些越界读出来的垃圾数据。
  • 顺便说一句:如果你的char数组没加'\0',结果会和int数组一样,循环会越界输出垃圾字符,直到碰到内存里的0才停止。你这次char数组能正常输出,全靠末尾的'\0'。

内容的提问来源于stack exchange,提问作者Rashmi Shete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:30:57