Chinaunix首页 | 论坛 | 博客
  • 博客访问: 834574
  • 博文数量: 143
  • 博客积分: 455
  • 博客等级: 一等列兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 00:11
文章分类

全部博文(143)

文章存档

2018年(10)

2017年(6)

2016年(28)

2015年(14)

2014年(67)

2013年(1)

2012年(17)

我的朋友

分类: LINUX

2014-06-04 21:53:22

char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
printf("sizeof(c):%d\tstrlen(c):%d\n",sizeof(c),strlen(c));
printf("sizeof(d):%d\tstrlen(d):%d\n",sizeof(d),strlen(d));
printf("sizeof(e):%d\tstrlen(e):%d\n",sizeof(e),strlen(e));

输出结果是
4 6
7 6
6 14

sizeof()操作符返回对象/类型所占空间大小(字节为单位),类型为size_t(看头文件可以知道就是int,只不过被typedef了一下标示用途而已)。常见用法有sizeof(变量)和sizeof(类型),具体实例代码有很多,可以自行搜索。
这个返回值的大小并不一定是对象的内容所占的空间。基于效率方面考虑,存在编译对齐这一行为,对于结构体来说,成员分布不一定连续,sizeof()的结果往往大于本身各个数据成员sizeof()返回值之和。(数组是连续存放的,通常编译器通常不对数组实施对齐,所以这里不需要考虑这点。)
strlen是从参数给定的内存地址开始判断该地址上对应的char值是否为0,如果不是则继续判断下一个,最后返回非0字节的个数,所以不只适用于字符串。不过对于非字符串,由于字符串结束符0存在的不确定,所以不一定能得到结果,有可能会因为访问到被系统保护禁止读取的内存区段导致程序崩溃。

sizeof(c):4,strlen(c):6。
c为指针,sizeof结果和sizeof(int)相同(32位系统中为4)。
c指向了长度为6的字符串字面量,所以strlen(c)返回6。
sizeof(d):7,strlen(d):6。
d是char[]数组,初始化中可以确定它的类型是char[7],每个元素(char型)占1个字节,所以共7字节。strlen理由同上。
注意初始化列表中的两个双引号之间的字符串字面量填充到数组中时,会自动在最后补0。
sizeof(e):6,strlen(e)。
由初始化可见e是char[6]型的。
strlen(e)理论上来说是不确定的。如果LZ给的代码放在函数体内,定义的是自动变量,这里以字符串形式输出e可以发现后面有d的内容。(不是 GhostWzf 说的“自动分配”,LZ可以自己改变d的内容然后再输出看看。)原因是C实现过程中,自动变量存储在栈空间上,内存是高内存地址向低内存地址分配的。所以可以通过之前定义的变量来估计可能的结果。但是实际一般不会用这种方法,变数太多(例如受到对齐设置的影响)。相对而言,strlen作用于非字符串,结果无法预料,本身就是错误的(非语法错误,是语义错误/逻辑错误),所以,结果无法预料。

sizeof: 根据你的内容的大小,返回一个数值。也就是说它反映的是你的数组的空间大小,或者是指针的大小。
strlen:根据你数组中字符串的大小,返回一个数值。字符串,是以0结尾的ASCII码。其中0所在的位置不算在字符串内。其中要注意一点,strlen长度记到0结束,跟数组的大小没有关系。

以上问题就很好解决了:
sizeof(c):4,strlen(c):6      这里的c为指针,那么就反映指针的大小
sizeof(d):7,strlen(d):6      这里的d是数组
sizeof(e):6,strlen(e):(不能确定) 对于这个数组,因为其只包含6个字符其中不包括0,而strlen要查到0才算结束,所以超出6个字符就不一定到什么位置能结束了
转载自:http://blog.sina.com.cn/s/blog_686188ef0100k2x1.html
阅读(2459) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~