计算字符串长度--strlen和sizeof

今天敲代码时候,要计算发送的字符串大小,如下:

char *p = "hello world";
int len1 = sizeof(p)/sizeof(char);

结果,不管我怎么改变字符串长度,len1都是等于4(这个值在不同平台和不同编译器不一样)。

后来查了一下,才发现自己错了,现总结一下。

1. sizeof

sizeof是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组指针数据类型对象函数等

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小

由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构体或数组所占的空间,返回值跟对象结构数组所存储的内容 没有关系。

具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:

  1. 数组名——编译时分配的数组空间大小;
  2. 指针变量——存储该指针所用的空间大小;
  3. 数据类型——该类型所占的空间大小;
  4. 对象——对象的实际占用空间大小;
  5. 函数——函数的返回类型所占的空间大小,函数的返回类型不能是void。

2. strlen

strlen是函数,要在运行时才能计算。参数必须是字符型指针(char*),当数组名作为参数传入时,实际上数组就退化成指针了。

它的功能是:返回字符串的长度

该字符串可以是自己定义的,也可以是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL(\0),返回的长度大小不包括NULL(\0)

3. 举例

char arr[10] = "hello";
int len1 = sizeof(arr);
int len2 = strlen(arr);
printf("%d and %d",len1,len2);

输出结果是:10 and 5

分析:sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、(一共三十题) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex阅读 992评论 0 0
  • 一、(一共三十题) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex阅读 766评论 0 2
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,542评论 1 51
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,465评论 0 35
  • 一、产品经理是什么 官方的定义,产品经理是负责并保证高质量的产品按时完成和发布的专职管理人员。他的任务包括...
    袁北斗阅读 249评论 0 0