char 溢出

#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-10-23 19:58  Charliee  阅读(763)  评论(0编辑  收藏  举报