溢出
先贴上代码:
#include<stdio.h> #include<string.h> // strlen()的头文件,可以省去 int main(void) { char a[1000]; int i; int len=0; for (i=0;i<1000;i++) { a[i]=-1-i; } printf("%d",strlen(a));
//strlen(a)是从a的首地址开始往后查找,直到找到'\0',因为'\0'是字符串结束的标志,又由于char只占一个字节,a[127]=-128,a[128]=127,...,a[255]=0, printf("\n\na=\n"); for (i=0;i<1000;i++) { if (a[i]=='\0') { printf("%d",a[i]); break; } else { printf("%d,",a[i]); len++; } } printf("\n\nlen=%d\n",len); getchar(); return 0; }
主要注意两个函数strlen()和sizeof():
- strlen(): char a[]; strlen(a)表示从a数组的首地址开始一直到遇见'\0'为止,所有字符的个数,像在这里a[127]=-128,a[128]=127,...,a[255]=0,
而'\0'是字符串结束的标志,'\0'对应十进制0,也就是NULL,所以该数组共有255个字符,最后一个为NULL,strlen()函数不把NULL记录在内,因此返回值为255。 - sizeof()返回的是数字类型所占的字节数,如:sizeof(int)=4,sizeof(char)=1.....
- char 数组的溢出:由于int占4个字节,而char 只有1个字节,故整数类型在强制转换为字符类型的过程中就会存在溢出,一个字节能表示的整数范围为-128——127,用二进制表示就是10000000——011111111,所以-129 就是100000000-1=01111111(127),-1用11111111表示,所以就可以得到a[255]=0。