首页 > 技术文章 > Sizeof and Strlen

cnsealine 2014-03-14 08:16 原文

sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾。

按《the C PROGRAMMING LANGUAGE》P135: C provides a complie-time unary operator called sizeof that can be used to compute the size of any object,the expressions sizeof object and sizeof(type name) yield an integer equal to the size of the specified object or type in bytes,An object can be a variable or array or structure(struct + struct tag), A type name can be name of a basic type like int or double, or a derived type like a structure(struct name) or a pointer.

 

以下来自:http://blog.csdn.net/chenjin_zhong/article/details/6097984

(1) sizeof是一个C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度。

(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度

实例1:

printf("char=%d/n",sizeof(char));  //1 printf("char*=%d/n",sizeof(char*)); //4 printf("int=%d/n",sizeof(int)); //4 printf("int*=%d/n",sizeof(int*)); //4 printf("long=%d/n",sizeof(long)); //4 printf("long*=%d/n",sizeof(long*)); //4 printf("double=%d/n",sizeof(double)); //8 printf("double*=%d/n",sizeof(double*)); //4

 

可以看到,char占1个字节,int占4个字节,long点4个字节,而double占8个字节。但 char*,int*,long*,double*都占4个字节的空间。

这是为什么呢?

在C语言中,char,int,long,double这些基本数据类型的长度是由编译器本身决定的。而char*,int*,long*,double*这些都是指针,回想一下,指针就是地址呀,所以里面放的都是地址,而地址的长度当前是由地址总线的位数决定的,现在的计算机一般都是32位的地址总线,也就占4个字节。

 

 实例2:

char a[]="hello";

char b[]={'h','e','l','l','o'};

 strlen(a),strlen(b)的值分别是多少?

 

前面分析过,strlen是求字符串的长度,字符串有个默认的结束符/0,这个结束符是在定义字符串的时候系统自动加上去的,就像定义数组a一样。数组a定义了一个字符串,数组b定义了一个字符数组。因此,strlen(a)=5,而strlen(b)的长度就不确定的,因为strlen找不到结束符。

 

下面是网上的一个比较经典的例子,分析一下:

 

char *c="abcdef";

char d[]="abcdef";

char e[]={'a','b','c','d','e','f'};

 

printf("%d%d/n",sizeof(c),strlen(c));

printf("%d%d/n",sizeof(d),strlen(d));

 

printf("%d%d/n",sizeof(e),strlen(e));

 

输出的结果是:

4 6

7 6

6 14

 

 

分析一下:

第一行定义c为一个字符指针变量,指向常量字符串,c里面存放的是字符串的首地址。

第二行定义d为一个字符数组,以字符串的形式给这个字符数组赋值。

第三行定义的也是个字符数组,以单个元素的形式赋值。

 

当以字符串赋值时,"abcdef",结尾自动加一个"/0".

 strlen(c)遇到/0就会结束,求的是字符串的长度,为6.

 sizeof(c)求的是类型空间大小,在前面说过,指针型所点的空间大小是4个字节,系统地址总线长度为32位时。

 

strlen(d)也是一样,字符串赋值,自动添加/0,求字符串的长度当然是6.

sizeof(d)是求这个数组所占空间的大小,即数组所占内存空间的字节数,应该为7.

 

sizeof(e), 数组e以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节。

strlen(e),去找/0结尾的字符串的长度,由于找不到/0,所以返回的值是一个不确定的值。

推荐阅读