sizeof和strlen小结

写在前面

之所以要总结一下sizeof和strlen的用法和区别,是因为这些知识可以帮助我们更加深入的理解各种数据结构在内存中的占用情况,也许表面上看好像没有多大用处,但有了这种理解,或许会对以后的编码有帮助。

sizeof

sizeof是一种操作符,它的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。sizeof表达式的结果是编译时常量。具体有以下三种用法:
sizeof(类型名)
sizeof(表达式)
sizeof 表达式
使用sizeof操作符时,其结果部分地依赖所涉及的类型:
1、对char类型或值为char类型的表达式做sizeof操作保证得1;
2、对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小;
3、对指针做sizeof操作将返回存放指针所需的内存大小
4、对数组做sizeof操作等效于将其元素做sizeof操作的结果乘上数组元素的个数。
需要注意的是,sizeof不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来! 其返回值类型为size_t,在头文件stddef.h中定义。
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如:

char ary[sizeof(int)*10];//ok

sizeof()函数返回的是变量声明后所占的内存数,不是实际长度。
测试代码如下:

    char *str = "I'm ok";
char dst[] = "I'm ok"; cout<<"sizeof *str = "<<sizeof(*str)<<endl;
cout<<"sizeof str = "<<sizeof(str)<<endl;
cout<<"sizeof dst = "<<sizeof(dst)<<endl;

程序运行结果如图:

结果分析:
sizeof(*str):*str实际上就是'I',求sizeof(*str) = sizeof(char) = 1;
sizeof(str): str是一个指向字符串的指针,指针在内存中占4字节,因此sizeof(str) = 4;
sizeof(dst) : dst是一个数组,对数组做sizeof返回的是数组中元素的个数与单个元素sizeof的乘积,
但是需要注意的是,字符串数组默认以'\0'结尾,因此dst数组中实际上有7个char元素,sizeof(dst) = 7

strlen

strlen()是C中的一个函数,包含在头文件#include<string.h>中,函数原型如下:
extern unsigned int strlen(char s)
用法:strlen (字符数组名)
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NULL。
其结果在
运行时才能计算。参数必须是字符型指针(char)。当数组名作为参数传入时,实际上数组就退化成指针了
测试代码及分析:

char *str = "I'm ok";
cout<<strlen(str)<<endl;//结果为6 char dst[] = "I'm ok";
cout<<strlen(dst)<<endl;//结果为6 char ch1[10];
cout<<strlen(ch1)<<endl; //结果是不定的 char ch2[10]={'\0'};
cout<<strlen(ch2)<<endl; //结果为0 char ch3[10]="jun";
cout<<strlen(ch3)<<endl; //结果为3,但不一定正确,
//如果编译器将其他的非零字符串放在ch3[10]的内存地址后,strlen结果还是不定的 //char ch4[5] = "hello";//编译错误,因为数组实际大小为6,声明的大小为5,报“数组界限溢出”错误

两者区别

(以下参考自百度百科)
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用于一个结构类型时或变量, sizeof 返回实际的大小,当适用于静态的空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址

sizeof和strlen小结的更多相关文章

  1. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

  2. sizeof和strlen的区别

    一.sizeof    sizeof(...)是运算符,而不是一个函数.    sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...

  3. Sizeof与Strlen的区别与联系

    转自:http://www.cnblogs.com/carekee/articles/1630789.html 一.sizeof    sizeof(...)是运算符,在头文件中typedef为uns ...

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

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  5. sizeof()和strlen()

    sizeof计算的是栈中大小 P { margin-bottom: 0.21cm; direction: ltr; color: rgb(0, 0, 0); text-align: justify } ...

  6. sizeof 和 strlen 的区别

    sizeof 和 strlen 都是c/c++ 中常见的符号,他们的功能是判断数组长度.那么他么到底有什么区别 1.sizeof    不是函数,而是一个操作符.字节数的计算在程序编译时进行,而不是在 ...

  7. C++-sizeof和strlen的区别

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

  8. sizeof 和 strlen 区别

    Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ...

  9. sizeof()与strlen()的区别

    首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点: 1.sizeof是一个关键字,而strlen确实一个函数. 2.sizeof求的是字节长度,而 ...

随机推荐

  1. 李洪强iOS之Foundation框架—字符串

    Foundation框架—字符串 一.Foundation框架中一些常用的类 字符串型: NSString:不可变字符串 NSMutableString:可变字符串 集合型: 1) NSArray:O ...

  2. lintcode 中等题: reverse linked list II 翻转链表II

    题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...

  3. java如何得到GET和POST请求URL和参数列表

    转载:http://blog.csdn.net/yaerfeng/article/details/18942739 在servlet中GET请求可以通过HttpServletRequest的getRe ...

  4. Nhibernate

    Nhibernate入门与demo 学习和使用Nhibernate已经很久了,一直想写点东西和大家一起学习使用Nhibernate.博客园里也有很多大牛写了很多关于Nhibernate入门的文章.其中 ...

  5. HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)

    Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...

  6. CentOS7 升级python同时解决yum损坏问题

    CentOS7中的python版本为python2.7.5,升级到最新版的python时需要注意两个问题 新版的python安装好后要修改python的系统默认指向问题 升级到最新版python后yu ...

  7. EJB--事务管理 .

    在我们对事务的基本概念以及出现的问题和隔离级别有进一步的了解之后,接下来看看EJB是如何进行事务管理. 在EJB中有两种使用事务的方式.第一种方式通过容器管理的事务,叫CMT(Container-Ma ...

  8. /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决

    升级cmake时,提示"Error when bootstrapping CMake:Problem while running initial CMake",第二次运行./boo ...

  9. AutoResetEvent

    private static readonly AutoResetEvent autoResetEvent = new AutoResetEvent(false); private static vo ...

  10. MyBatis学习总结3-优化MyBatis配置文件

    连接数据库配置优化 可以将数据库连接配置信息卸载conf.xml中,但是为了优化连接,专门写一个properties用于存数据库连接信息,然后在conf.xml中进行引用,里面包括数据库驱动,地址,用 ...