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

