sizeof和strlen的c++问题

#include "stdio.h"
#include "string.h"
void main()
{
char a1[10]={'a','b','c','d'};
char a2[]={'x','y','z'};
char a3[]="sdfg";
char a4[4]="abc";
char a5[4]={'e','f','g','h'};

printf("%d,%d\n",sizeof(a1),strlen(a1));
printf("%d,%d\n",sizeof(a2),strlen(a2));
printf("%d,%d\n",sizeof(a3),strlen(a3));
printf("%d,%d\n",sizeof(a4),strlen(a4));
printf("%d,%d\n",sizeof(a5),strlen(a5));

}

讲一下为什么是那种结果
a2没有说明长度,那位什么会找不到\0呢???又没有越界,a2的长度又赋值的长度决定的呀????

sizeof计算出来的是所占字节数,strlen算出来的是字符数,不包括'\0'
a1[10]有10个char所占的空间,char占1个字节,所以a1[10]占10个字节,但是只有4个字符
a2[]没有指定大小,大小是根据后面的元素个数自动计算的,所以是3;字符数也是3
a3[]也没有指定大小,用一个字符串来初始化,字符串都是以'\0'结尾的,因此字符串"sdfg"里面其实包含了's','d','f','g','\0'5个字符,所以占了5个字节;但是strlen不计算'\0',所以是4个字符
a4[4]同理,4个字节,3个字符
a5[4]同理,4个字节,4个字符//
但是运行的时候是11个字符,这点我暂时没明白.思考下,可能是这个原因:strlen的参数是字符串,也就是必须到'\0'才结束
a5里面没有'\0',因此strlen会往后找,直到找到'\0'为止

void main()是可以的,用双引号包含头文件也是可以的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-27
sizeof:对于字符数组变量,返回其数组所占字节数,所以a1[10]就是10。a3[]="sdfg"中未指定数组大小,初始化时自动分配合适的大小(就是刚好容下那个字符串的大小,要记得最后有个'\0'字符的)
strlen:返回字符数组/指针中字符串的长度,即从起始位置到'\0'(不包含'\0')的字符数

"a5[4]同理,4个字节,4个字符//但是运行的时候是11个字符,这点我暂时没明白"
我的运行结果是7。此值是不确定的,因为不能确定程序会在哪里遇到'\0'字符。

PS:1、使用void main()是错误的(在gcc中;你还用TC?);main函数必须返回int类型;
2、请使用<>来包含系统头文件(这样比较好而已)本回答被提问者采纳
第2个回答  2009-06-27
10,4
3,8
5,4
4,3
4,7
这是我运行出来的结果,有的地方不同电脑会不同,后面会提到
sizeof是计算字节数,字符变量是1个字节,所以有几个字符变量就是几个字节
strlen是计算字符串长度,不过字符串末尾的\0是不会算进去的
我逐一说吧
对于a1,a1定义长度是10,所以占字节数也就是10,你初始化了4个元素,后六个就是0,也就是\0,因为\0的值就是0。所以a1作为一个字符串,实际是
"abcd\0\0\0\0\0\0",所以字符串长度是4。
对于a2,你用的是不说明数组长度并且用逐一元素初始化的初始化方法,这样你初始化了几个元素,这个数组的长度就是多少。所以长度是3,但是a2的3个元素都被占满了,没有\0,所以作为字符串来讲编译器找不到结束符,就会出现一些乱七八糟的东西,你可以用puts(a2)来查看一下就知道了。不同电脑结果会不一样。
对于a3和a4,用字符串来初始化字符数组的时候,只要长度足够或者默认长度,编译器会自动加上一个\0做结束符
a5和a2差不多,也是没有\0导致的,同样可以用puts(a5)来查询
所谓字符串a,就是从a的地址开始往后,到第一个\0之间的内容
第3个回答  2009-06-27
strlen是计算从开始到'\0'之间的字节数的,不包括尾部的那个结束符。
对a1求strlen是依赖编译器把未指定的即从a[4]起元素置为0,否则肯定出错。
而a2就遇到了这个问题,字节流的莫非没有0,strlen继续跑,跑到a3哪里遇到0才停止。已经越界了。

a3就是编译器给分配了足够的容纳字符的空间,以及,还有一个额外的字节容纳0。

a4的写法靠自己计算,参考a3就知道4字节全用了。

a5那个和a2一样越界了,但是究竟是在哪里遇到 0是不确定的,这种BUG是程序崩溃的一种原因。

回头说sizeof,这个是能够在编译时刻根据变量类型确定的实际存储空间大小。
有的是你设定的,如明确给出数组下标,有的是编译器设定的,例如数组不写下标值而是根据初始元素的个数自动计算。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网