sizeof基础

在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其有两种表达形式:

(1)sizeof(类型说明符)

(2)sizeof 表达式

我们通常使用第(1)种形式。

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为:

typedef unsigned int size_t;

首先确定我们当前编译环境中C语言各个基本数据类型在内存中所占字节数,我这里是32bit编译环境:

#include <stdio.h>int main(void)
{printf("sizeof(char)  = %u\n", sizeof(char));printf("sizeof(short) = %u\n", sizeof(short));printf("sizeof(int)   = %u\n", sizeof(int));printf("sizeof(long)  = %u\n", sizeof(long));printf("sizeof(float) = %u\n", sizeof(float));printf("sizeof(double)= %u\n", sizeof(double));return 0;
}

我们这里的输出结果为:

sizeof典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个

#include <stdio.h>int main(void)
{char *s = "hello";printf("sizeof(char) = %u\n", sizeof(char));printf("sizeof(char*)= %u\n", sizeof(char*));printf("sizeof('a')  = %u\n", sizeof('a'));printf("sizeof(*s+0) = %u\n", sizeof(*s+0));printf("sizeof(*s)   = %u\n", sizeof(*s));printf("sizeof(s)    = %u\n", sizeof(s));return 0;
}

实际输出结果为:

你懵了吗?没懵的话算我输

简要分析:

(1)sizeof(char) 的值为1。因为char类型数据在内存中占1字节。

(2)sizeof(char*)的值为4。因为char*代表一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

(3)sizeof('a')的值为4。因为此处‘a’是独立存在的一个字符(没有赋值给其它变量),实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制为整数97。(貌似解释得有些牵强,但事实就是这样)但是需要注意的是,若有如下定义:

char ch = 'a';

则此处ch的字节数sizeof(ch)的值为1,而不是4。

(4)sizeof(*s+0)的值为4,因为'h'+0 转化为int,占4字节。此处涉及到类型转换的问题。即不同类型的数据进行运算时,会首先转换成相同数据类型。转换规则为(图片来源于网络):

(5)sizeof(*s)的值为1,因为此处*s为字符串s的第1个字符‘h’(注意与第三点区分开来,这里是有用char来修饰的),所以所占字节长度为1。

(6)sizeof(s)的值为4,同(2),此处s是一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。

End:以上就是本次的分享,如有错误,欢迎指出!欢迎转发、下载、收藏、点赞


扫码或长按关注

回复「 加群 」进入技术群聊

sizeof你真的弄明白了吗?相关推荐

  1. c语言sizeof char,sizeof 你真的弄明白了吗?来看看这个例子

    原标题:sizeof 你真的弄明白了吗?来看看这个例子 sizeof基础 在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数).其 ...

  2. sizeof你真的弄明白了吗?来看看这个例子

    本文 转自「嵌入式大杂烩」,喜欢的同学可以关注~ sizeof基础 在C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数).其有两种 ...

  3. 你真的弄明白了吗?Java并发之AQS详解

    你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...

  4. java中new与newitance_你真的弄明白 new 了吗

    好久没有写点东西了,总觉得自己应该写点牛逼的,却又不知道如何下笔.既然如此,还是回归最基本的吧,今天就来说一说这个new.关于javascript的new关键字的内容上网搜一搜还真不少,大家都说new ...

  5. mysql编码问题——charset=utf8你真的弄明白了吗?

    导读:以前学习mysql的时候,一直不知道"charset=utf8"是什么意思,更不知道"set names gbk"是什么意思,通过这篇文章将会给大家详细介 ...

  6. 对于神经网络,硕博士不需要弄明白原理,只需要应用,是这样吗?

    链接:https://www.zhihu.com/question/433274875 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 作者:匿名用户 https://www.zhihu.com ...

  7. 想做程序员?弄明白这些问题,你会少走很多弯路

    前言 几乎每一个新手程序员都会走上那么一段自学的道路,尤其是在校生或进入工作岗位之后,技术的提升基本都靠自学,有的虽然是网上报班学习,但更多时候还是自己在学习,师傅引进门,修行靠个人. 有的人自学很快 ...

  8. 无处 不在的无线智能——6g 的关键驱动与研究挑战_三星电子发布6G白皮书 网友:先把5G弄明白...

    (记者 陈洲)据韩联社报道,三星电子14日发布题为<下一代超连接体验>的6G白皮书,阐述6G愿景.白皮书中提到,第六代移动通信技术将实现T级(tera bps级)数据传输速率,无线网络延迟 ...

  9. 3分钟弄明白JAVA三大修饰符

    3分钟弄明白JAVA三大修饰符 JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆.所以来总结对比 ...

最新文章

  1. 空空排错日志:OCS错误日志14501等解决办法
  2. AI如果耍起了心眼,人类就像个白痴......
  3. 远程连接 SuSE Linux 设置方法
  4. C51存储器类型与51单片机的物理区域
  5. Spring Boot————应用启动时的监听机制测试
  6. 安卓button设置背景图_这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !
  7. 99.6%屏占比 vivo NEX 3升级版入网:865+55W快充
  8. linux 套接口文件_继上一篇,继续介绍linux 套接口
  9. yolov2 损失函数_目标检测算法之YOLOv2损失函数详解
  10. eclipse混淆打包出错
  11. C# Aspose 去除水印 亲测有效!!!(有效测试时间:20220806)
  12. ACID特性的实现原理与MySQL事务的关系
  13. java检测自身签名_使用签名检测PDF更改
  14. Inventor冲压加强筋_inventor 加强筋教程
  15. python绘图:散点图,密度图并保存成图片
  16. Rust:Structuring and handling errors in 2020学习笔记
  17. JavaBean对象与jfinal的Record对象互转
  18. 把一个运行的Docker容器做成镜像
  19. netsh interface portproxy 转发不生效_最新!“海高斯”已登陆珠海金湾区!人不出门,车不上路!...
  20. .Net neatupload上传控件实现文件上传的进度条

热门文章

  1. Difference between CGLIB JDK Dynamic Proxies
  2. 飞康CEO:敢于向传统的灾备法则说“不”
  3. 网络基础知识 快速计算子网掩码的2种方法
  4. @Pointcut的用法
  5. 传输层与数据链路层滑动窗口协议的异同
  6. 前端之 JavaScript 常用数据类型和操作
  7. python爬取网易云歌单_详解python selenium 爬取网易云音乐歌单名
  8. Python脚本实现图片加水印
  9. 通过__tablename__ = 'xxx' #定义表名
  10. .net core EPPlus npoi_2020 ASP.NET界面开发:DevExpress v20.1支持.NET Core设计时