C 语言中的 strlen 与 sizeof 的区别

本文转载自:

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;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值