本文转载自:
http://blog.csdn.net/chenjin_zhong/article/details/6097984。
对原文内容稍作了修改。
sizeof 与 strlen 是有着本质的区别。大体上,sizeof 是求数据类型所占的空间大小,而 strlen 是求字符串的长度,字符串以 '\0' 结尾。它们的区别归纳如下:
(1) sizeof 是一个 C 语言中的一个单目运算符,而 strlen 是一个函数;
(2) sizeof 求的是数据类型所占空间的大小,而 strlen 是求字符串的长度。
如下给出一个使用 sizeof 的例子,注释部分是每行的输出结果:
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 个字节。
如下给出一个 strlen 的例子:
char a[] = "hello";
char b[] = {'h', 'e', 'l', 'l', 'o'};
试问 strlen(a), strlen(b) 的值分别是多少?前面分析过,strlen 是求字符串的长度,字符串有个默认的结束符 '\0',这个结束符是在定义字符串的时候系统自动加上去的,在定义数组 a 的时候就自动加上去了,也就是说字符数组 a 包括 6 个字符,但是 strlen(a)=5,在使用 strlen 函数计算字符床长度时是不计算最后一个 '\0' 字符的。数组 b 定义了一个字符数组,而 strlen(b) 的长度就不确定,因为 strlen 找不到结束符 '\0'。
下面是网上的一个比较经典的例子,分析一下:
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) 遇到就会结束,求的是字符串的长度为 6;sizeof(c) 求的是类型空间大小,在前面说过,指针型所点的空间大小是 4 个字节,系统地址总线长度为 32 位时。strlen(d) 也是一样,字符串赋值,自动添加 '\0',求字符串的长度当然是 6;sizeof(d) 是求这个数组所占空间的大小,即数组所占内存空间的字节数,应该为 7。数组 e 以单个元素赋值,没有 '\0' 结束符,所以所占空间的大小为 6 个字节;strlen(e) 去找 '\0' 结尾的字符串的长度,由于找不到'\0',所以返回的值是一个不确定的值。
最后大家可以做个测试,猜猜如下程序的输出结果?
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p = "hello";
char x[] = "hello";
printf("%d %d\n", sizeof(x), sizeof(p));
printf("%d %d\n", strlen(x), strlen(p));
return 0;
}