一.本质区别

sizeof和strlen有本质上的区别。sizeof是C语言的一种单目运算符,如++、--等,并不是函数,sizeof的优先级为2级,比/、% 等3级运算符优先级高,sizeof以字节的形式给出操作数的存储空间的大小。而strlen是一个函数,是由C语言的标准库提供的。strlen计算的 是字符串的长度。

二.使用区别

1.sizeof

sizeof的操作数可以是数据类型、函数、变量,表达式使用方式为:

(1)数据类型

sizeof (type)

例如我们要计算一个int型数据的存储空间可以用: sizeof(int)。需要注意的是sizeof的操作数是数据类型时要加括号。其数值大小为该数据类型所占的存储空间的字节数。

(2)变量

sizeof(变量名)
如果定义 int a ,可以使用sizeof (a)计算a变量占据的存储空间。具体大小与a的类型有关。

注意:由于sizeof是操作符sizeof a或sizeof (a)都可以。(可以不使用括号),如果操作数是数组名则给出数组所占用内存的字节数。如果数组名做函数的参数传递时退化为指针。

(3)表达式

sizeof (表达式)
sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。例如:sizeof(1+1.5)
(4)函数调用
            
sizeof(函数名())

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,举例来说定义如下函数:

int myprint()
{
   printf(“hello\n”);
   return 0;
}

int main()
{
printf(“%d”,sizeof(mypaint()));
return 0;
}
结果只打印函数返回类型的sizeof值,并没有打印hello说明函数myprint并没有调用。

C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
如:sizeof(myprint)(注意sizeof(myprint()是可以的))
或者sizeof一个void返回类型的函数如:
void foo () { }
sizeof( foo () );
     以及位域:
struct S
{
unsigned int f1 : 1;
unsigned int f2 : 5;
unsigned int f3 : 12;
};
sizeof( S.f1 );

2.strlen

strlen的应用则不像sizeof那么广泛,strlen的参数必须是char *的指针,如果用strlen计算数据类型strlen(int)这种用法是错误的。strlen的计算必须依赖字符序列中的’\0’字符,strlen 就是通过判断是否遇到’\0’来判断字符序列是否结束的。
它的计算原理类似于下面的两条语句
while(*p!=’\0’)
    length++

strlen的用法:分为以下几种参数

(1)char * 指针
     
strlen(指针名)

如果参数是指针则计算该指针指向字符序列的长度。(以’\0’作为判断标志)例如:

定义char *p=“hello world”;strlen(p)=11,而sizeof (p)=4。可以看到strlen计算的是指针指向的字符串的长度而sizeof计算的是指针本身所占用的内存空间的大小。

(2)数组

strlen(数组名)

如果参数是数组的话,实际传递的是一个指针,strlen会按照上面处理指针的模式处理该数组。

我们可以看下面的例子:
       
char a[]=”hh”;
         strlen(a);

很显然strlen的结果是2。但是如果数组是这样赋值的呢?
      
char a[]={‘h’,’h’};
         strlen(a);

那么现在strlen(a)的结果又是多少呢?这个数就不一定了,原因是strlen会去计算a地址开始的字符串的长度,由于前一种赋值方式会将hh以字 符串的形式赋值给数组会将字符串结束符’\0’一同赋值,这时strlen就会检查到结束符停止计算,而第二种复值方式是以单个字符的形式赋值没有结束 符’\0’,这时我们用sizeof得到的结果是正常的,而用strlen由于找不到结束符,会继续的计算直到找到结束符为止。所以这个数是不确定。

更多嵌入式linux及编程学习交流的文章,请访问我的个人网站”恩享网” :http://www.enxiang.icoc.cc,期待与您共同进步。

转载于:https://www.cnblogs.com/LJTbozai/archive/2013/03/28/2987090.html

sizeof 和strlen的区别相关推荐

  1. Sizeof与Strlen的区别与联系(转)

    一.sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.     它的功能是:获得保证能 ...

  2. C语言中sizeof与strlen的区别总结!

    C语言中sizeof与strlen区别总结! 先上一个例子: 结果: 一.sizeof与strlen char c[] = "abc\0cba"; 问题1:sizeof(c) = ...

  3. Sizeof与Strlen的区别与联系

    Sizeof与Strlen的区别与联系(转) 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小 ...

  4. C语言 - sizeof和strlen的区别

    sizeof和strlen的区别: 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. 2.s ...

  5. sizeof和strlen的区别(其中涉及NUL的讲解)

    本文是自己结合平时所学的知识,对sizeof和strlen的区别进行了总结,如有不对的地方还请批评指证,共同进步!!! 一.从C语言的定义上来讲 1.sizeof是关键字,而strlen是包含在str ...

  6. C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程

    目录 一.sizeof 函数与 strlen 函数区别 1.获取字符串长度 – 针对字符串 2.获取指针/数组长度 – 针对指针/数组 3.sizeof 获取内存大小 4.经典案例 二.猜你喜欢 零基 ...

  7. 详说sizeof与strlen的区别与联系

    sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位). 当参数分别如下时,sizeof返回的值表示的含义如下: ...

  8. 简述sizeof和strlen的区别

    sizeof和strlen的区别 属性不同: sizeof是运算符(关键字),strlen是函数 用法不同: sizeof可以使用类.结构体.共用体以及其他用户自定义的数据类型作为参数,然后计算相应的 ...

  9. sizeof与strlen的区别

    以下内容参考自<程序员面试宝典> sizeof与strlen的区别 1. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能 ...

  10. C语言中的sizeof()和strlen()的区别

    C语言中的sizeof和strlen的区别 sizeof() strlen 大量案例(想深入了解可以看) 1.(花括号int的sizeof()) 2.(花括号char的sizeof()) 3.(字符串 ...

最新文章

  1. Django3.0 +Python3 连接mysql遇到django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer
  2. 病毒入侵:全靠分布式
  3. 【Tools】cmake之编写CMakeLists.txt示例
  4. Oracle database server 安装tips
  5. git多项目管理模式_Git十年,一项开放商业模式倡议以及更多新闻
  6. Duilib初级控件扩展一例: 具有鼠标滚动消息的OptionUI
  7. matlab空域内图像增强之灰度变换增强
  8. [收藏]Web创业的10条戒律
  9. xampp 运行 yaf框架
  10. 计算机二级2018VB题库百度云,2018年计算机二级VB考试真题
  11. [机器学习导论]——第三课——神经网络Ⅰ
  12. ENSP-----华为USG6000防火墙
  13. 使用STM8S003F3P6的硬件I2C读写AT24C16的EEPROM的经验心得
  14. vue 实现高德地图搜索地址获取经纬度
  15. 简易计算器,你值得拥有
  16. ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
  17. B. Luxurious Houses
  18. 计算机毕业设计太难做不出来怎么办?
  19. 达内学软件测试发证书吗,达内软件测试培训让我拥有了实际工作经验
  20. CP2102 USB驱动

热门文章

  1. 企业网络推广——企业网络推广中如何解决网站排名提升难题?
  2. 网站优化之网站文章更新需注意哪些问题?
  3. 网站载入太慢直接影响用户访问体验,该如何优化?
  4. plor 回归的r方_简单线性回归模型
  5. vrp车辆路径问题 php,蚁群算法在车辆路径问题(VRP)中的应用.ppt
  6. Retrofit2.0 请求数据 一直出返回网络错误,错误代码 414
  7. (转载)IP,主机名,域名
  8. angular指令:tm.tags添加/删除标签
  9. python中ocr软件tesseract使用
  10. P1219 八皇后 含优化 1/5