一、好首先看看sizeof和strlen在MSDN上的定义:
首先看一MSDN上如何对sizeof进行定义的:

sizeof Operatorsizeof expressionThe sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type
(including aggregate types). This keyword returns a value of type size_t.The expression is either an identifier or a type-cast expression (a type specifier enclosed in
parentheses).When applied to a structure type or variable, sizeof returns the actual size, which may include
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof
returns the size of the entire array. The sizeof operator cannot return the size of dynamically
allocated arrays or external arrays.

然后再看一下对strlen是如何定义的:

strlenGet the length of a string.Routine Required Header:
strlen <string.h>size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.Return Value
Each of these functions returns the number of characters in string, excluding the terminal
NULL. No return value is reserved to indicate an error.Remarks
Each of these functions returns the number of characters in string, not including the
terminating null character. wcslen is a wide-character version of strlen; the argument of
wcslen is a wide-character string. wcslen and strlen behave identically otherwise.

二、由几个例子说开去。
第一个例子:

char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2      

第二个例子:

class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上

第三个例子:

char szPath[MAX_PATH]

如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
三、sizeof深入理解。

  • 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
  • 2.sizeof是算符,strlen是函数。
  • 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:
    short f();
    printf("%d\n", sizeof(f()));

    输出的结果是sizeof(short),即2。

  • 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
  • 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
    char str[20]="0123456789";
    int a=strlen(str); //a=10;
    int b=sizeof(str); //而b=20;
  • 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
  • 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
  • 8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
  • 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
    fun(char [8])
    fun(char [])

    都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

    fun(unsiged char *p1, int len)
    {unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);
    }

    有关内容见: C++ PRIMER?

  • 10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
  • 11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式

四、结束语
sizeof使用场合。

  • 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

      void *malloc(size_t size), size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
  • 2.用它可以看看一类型的对象在内存中所占的单元字节。
    void * memset(void * s,int c,sizeof(s))
  • 3.在动态分配一对象时,可以让系统知道要分配多少内存。
  • 4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
  • 5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
  • 6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

转载于:https://www.cnblogs.com/pxguoo/archive/2011/08/12/2136599.html

Comperhend the OP-sizeof deeply!相关推荐

  1. Linux多线程编程----IO【select、poll、epoll】

    IO操作多   速度就下降 IO数据的 读和写 IO的完成 必须等到 读事件(如磁盘 拷贝  每次要从磁盘查找数据) 和 写事件 (允许写 如写太快 写满就要马上阻塞)的就绪 IO是否高效 :主要看一 ...

  2. windows命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节. 将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据.命名管道服务器和客户机的区别在于:服务器 ...

  3. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. VC批量拷贝,移动,删除文件---SHFileOperation

    SHFileOperation 函数功能描述:文件操作,与 Shell 的动作相同. 函数原型: #include<shellapi.h> WINSHELLAPI int WINAPI S ...

  5. 【项目介绍】协程——C语言实现的用户态非抢占式轻量级线程

    文章目录 项目介绍 开发语言 开发环境 项目简介 项目特点 适用场景 发布链接 使用介绍 上下文环境 宏 协程状态 协程与调度器结构体 接口 示范用例 使用协程实现一个TCP服务器 项目介绍 开发语言 ...

  6. 这个结构体对齐输出有意思

    这个题目是我在群里看到大家讨论的,既然是讨论的了,那我就拿出来说说,因为笔试面试的时候,可能就会遇到这样的题目. 实例代码 #include "stdio.h" #include ...

  7. 项目 协程-实现非抢占式TCP服务器

    协程(Coroutines)是用户态下的非抢占式的轻量级线程,是一种在程序开发中处理多任务的组件 项目介绍 项目开发环境 Linux 项目开发语言及工具 C.vim.gcc.gdb.Makefile ...

  8. POJ3983 快算24【暴力】

    快算24 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5375   Accepted: 3245 Description ...

  9. 用户态文件系统fuse学习

    FUSE概述 FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统.  在fuse出现以 ...

  10. [SPRD CAMERA] 5 HAL Camera open流程二

    open流程一主要是沿着open的主线一直到sensor open,着一些主要是看看 camera_init_internal 中的其他初始化流程 cmr_int camera_init_intern ...

最新文章

  1. centos7 docker 安装
  2. 【HAOI2015】按位或【Min-Max容斥】【FWT】
  3. Python简单的抓取静态网页内容
  4. 程序员“苦逼值”测试,分数越高越苦逼
  5. Faster-Rcnn扫盲
  6. secoclient Linux安装
  7. python代码模拟 手写字体
  8. 表情包生成引流源码 - Jason原创
  9. LayoutLM: Pre-training of Text and Layout for Document Image Understanding
  10. 颜色的16进制表达方式
  11. 微信小程序笔记、小程序打印
  12. 视觉感知特性 【1】人类视觉系统的信息处理机制的4个特性
  13. python爬取汽车之家数据_python 实现汽车之家车型数据爬虫
  14. uni-app——storage的使用(Storage、StorageSync)
  15. Canvas+html+css+position定位
  16. 关于Windows下Uninstall的注册表键值
  17. Qt编写安防视频监控系统17-在线地图
  18. mysql练习-数据库安全性与完整性
  19. Gradle 配置代理
  20. 【go-filecoin】V0.5.6 发布 / 命令更新

热门文章

  1. 计算机网络:三层ISP结构
  2. 絮语----工作四年的碎碎念
  3. 数据库建表需要外键约束吗?
  4. SQL:查询学习笔记
  5. Oracle的外部表
  6. 在iOS 中使用sleep方法 让程序暂停几秒钟
  7. chvg改变vg中LV的数量
  8. 单臂路由实验-VTP
  9. vue 路由相关操作
  10. ModuleNotFoundError: No module named 'win32api'