溢出

先贴上代码:
#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():

  1. 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。
  2. sizeof()返回的是数字类型所占的字节数,如:sizeof(int)=4,sizeof(char)=1.....
  3. char 数组的溢出:由于int占4个字节,而char 只有1个字节,故整数类型在强制转换为字符类型的过程中就会存在溢出,一个字节能表示的整数范围为-128——127,用二进制表示就是10000000——011111111,所以-129 就是100000000-1=01111111(127),-1用11111111表示,所以就可以得到a[255]=0。
posted @ 2011-04-09 23:07  左手写诗  阅读(262)  评论(0)    收藏  举报