`

sizeof strlen 的区别

 
阅读更多

sizeof 和strlen

直接给代码:

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()()操作符返回对象/类型所占空间大小(字节为单位)。这个返回值的大小并不一定是对象的内容所占的空间。基于效率方面考虑,存在编译对齐这一行为,对于结构体来说,成员分布不一定连续,sizeof()的结果往往大于本身各个数据成员sizeof()返回值之和。(数组是连续存放的,通常编译器通常不对数组实施对齐,所以这里不需要考虑这点。)

strlen是从参数给定的内存地址开始判断该地址上对应的char值是否为0,如果不是则继续判断下一个,最后返回非0字节的个数,所以不只适用于字符串。不过对于非字符串,由于字符串结束符0存在的不确定,所以不一定能得到结果。

sizeof:根据你的内容的大小,返回一个数值。也就是说它反映的是你的数组的空间大小,或者是指针的大小。

strlen:根据你数组中字符串的大小,返回一个数值。字符串,是以0结尾的ASCII码。其中0所在的位置不算在字符串内。其中要注意一点,strlen长度记到0结束,跟数组的大小没有关系。

 

以上问题就很好解决了:

 sizeof(c):4,strlen(c):6     这里的c为指针,那么就反映指针的大小。c为指针,sizeof结果和sizeof(int)相同(32位系统中为4)。c指向了长度为6的字符串字面量,所以strlen(c)返回6

sizeof(d):7,strlen(d):6    这里的d是数组,dchar[]数组,初始化中可以确定它的类型是char[7],每个元素(char型)占1个字节,所以共7字节(注意初始化列表中的两个双引号之间的字符串字面量填充到数组中时,会自动在最后补0strlen理由同上

sizeof(e):6, strlen(e):(不能确定)对于这个数组,因为其只包含6个字符其中不包括0,而strlen要查到0才算结束,所以超出6个字符就不一定到什么位置能结束了。

 测试结果:

#include<stdio.h>

void main()
{
	// 0 就是'\0'.('\0'的Asicii值等于0);
	//strlen计算字符长度,遇到0停止(不计算0);
	//sizeof计算总长度(包括0);

	//VC++中32位系统,给int分配32位,即四个字节,a数组第五个为0,
	//但是,它是int类型的,第一个'1'保存在内存的格式为 0x01 0x0 0x0 0x0;
	//即在strlen计算第一个数据时候,计算了0x01然后就遇到0了,所以strlen计算a的结果是1;
	int a[10]={'1','2','3','4',0,'\0'};
	
	//b数组,包含了5个元素,是char类型的,但是第六个后面我们不知道是什么,
	//所以strlen计算b的长度,不确定,sizeof就只计算5,因为数组长度就是5;
	//如果是{'1','2','3','4','5','\0'}加了个'\0',那么结果就不一样了:
	//此时sizeof就是6,strlen就是5了,因为strlen遇到'\0'就停止了
	char b[]={'1','2','3','4','5'};    
	
	//字符串赋值,此时内存默认在字符串后面添加一个'\0',然后计算结果同上
	char c[]="1234567";
	int d=0;

	printf("sizeof(a)=%d,strlen(a)=%d\n",sizeof(a),strlen(a));
	printf("sizeof(b)=%d,strlen(b)=%d\n",sizeof(b),strlen(b));
	printf("sizeof(c)=%d,strlen(c)=%d\n",sizeof(c),strlen(c));

	printf("%s\n%s\n%s\n",a,b,c);
	/*
	scanf("%d,%c",&c,&d);
	printf("\n%3d,%c\n",c,d);
	if(c==1&&d=='a')
		printf("ok\n");
	else 
		printf("no\n");
	*/
}

 输出结果查看 图片附件

  • 大小: 8.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics