日期:2014-05-16  浏览次数:20651 次

C语言的字符数组中sizeof()操作符的计算问题,请帮忙进来看看!
直接上DEMO程序:
main()
{
    char s[5]; 
    memset(s, 'A', sizeof(s));
    s[5] = '\0';
    printf("s=%s\n", s);   // 输出: s=AAAAA
    printf("sizeof(s)=%d\n", sizeof(s));  // 输出: sizeof(s)=5
    
}

我的问题如下:

1. char s[5], 表示字符数组s可以存储5个字符还是6个字符 ? 最后一个字符应该存储的是'\0'  

2. 输出s=AAAAA没有疑问, 但是sizeof(s)为什么输出5 ? sizeof(s)计算的是s的存储空间大小,最后一个'\0' 没有统计进去吗 ?

3. char c[] = "abcde",  则sizeof(c)=6, 为什么这里等于6而不是5? 显然这里在统计c的存储空间大小的时候,将'\0'统计进去了

DEMO非常简单,请这方面概念清楚的朋友们帮忙看看,非常感谢!

------解决方案--------------------
当适用了于一个结构类型或变量时,sizeof返回实际的大小,当适用一静态地址空间数组,sizeof返回全部数组的尺寸;

1. char s[5]表示存5个字符的数组,但这5个字符由于没有初始化,所以内容是随机的字符(不可预知的);
2. s[5] = '\0';这里你越界访问了(错误的使用),下标从0到4;sizeof()是5,这里不管最后一个字符是不是'\0';
3. sizeof计算静态字符串(存储在静态内存中)时,包括字符串最末尾的'\0'字符;

------解决方案--------------------
基础问题,好好看看C语言当中关于数组和指针那部分吧。
------解决方案--------------------
'\0'就是asc码为0的字符。计算静态字符串时当然会占字节数。