sizeof运算符介绍以及常见的坑
文章目录
- 一、基本概念
- 二、注意事项
- 1、sizeof(结构体)
- 2、不要对void使用sizeof
- 3、不要在子函数中对字符指针用sizeof
- 4、不要在子函数中对结构体指针用sizeof
- 三、获取视频教程
- 四、版权声明
一、基本概念
sizeof是C语言的关键字,它用来计算变量(或数据类型)在当前系统中占用内存的字节数。
sizeof不是函数,产生这样的疑问是因为sizeof的书写确实有点像函数,sizeof有两种写法:
用于数据类型
sizeof(数据类型);
数据类型必须用括号括住。
printf("字符型变量占用的内存是=%d\n",sizeof(char)); // 输出:字符型变量占用的内存是=1printf("整型变量占用的内存是=%d\n",sizeof(int)); // 输出:整型变量占用的内存是=4
用于变量
sizeof(变量名);sizeof 变量名;
变量名可以不用括号括住,带括号的用法更普遍,大多数程序员采用这种形式。
int ii;printf("ii占用的内存是=%d\n",sizeof(ii)); // 输出:ii占用的内存是=4printf("ii占用的内存是=%d\n",sizeof ii); // 输出:ii占用的内存是=4
二、注意事项
1、sizeof(结构体)
理论上讲结构体的各个成员在内存中是连续存放的,和数组非常类似,但是,结构体占用内存的总大小不一定等于全部成员变量占用内存大小之和。在编译器的具体实现中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙。用sizeof可以得到结构体占用内容在总大小,sizeof(结构体名)或sizeof(结构体变量名)都可以。
示例(book90.c)
/** 程序名:book90.c,此程序用于演示C语言的结构体占用内存的情况* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>// #pragma pack(1) # 告诉编器内存按1字节对齐。struct st_girl
{char name[50]; // 姓名int age; // 年龄int height; // 身高,单位:厘米cmchar sc[30]; // 身材,火辣;普通;飞机场。char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
};int main()
{struct st_girl queen;printf("sizeof(struct st_girl) %d\n",sizeof(struct st_girl));printf("sizeof(queen) %d\n",sizeof(queen));
}
运行效果
从上面的示例可以看出,struct st_girl全部成员变量占用的内存是50+4+4+30+30=118,但是结构体占用的内存是120。
注意,C语言提供了结构体成员内存对齐的方法,可以使结构体成员变量之间的内存没有空隙,启用#pragma pack(1)代码即可。
2、不要对void使用sizeof
printf("sizeof(void)=%d\n",sizeof(void)); // 输出sizeof(void)=1
以上代码在有些编译器中可能无法通过。
void是无值型或空类型,不知道存储空间大小的类型,编译器也不能确定它的大小。void不能声明变量,以下代码编译无法通过:
void vv;
但是以下代码是正确的:
void *pv;printf("sizeof(void*)=%d\n",sizeof(pv)); // 输出sizeof(void)=8
pv是一个void指针,在64位操作系统中,指针变量占用的内存的大小都是8,下同。
3、不要在子函数中对字符指针用sizeof
如果把一个字符串(如char strname[21])的地址传给子函数,子函数用一个字符指针(如char *pstr)来存放传入的字符串的地址,如果在子函数中用sizeof(pstr),得到的不是字符串占用内存的字节数,而是字符指针变量占用内存的字节数(8字节)。
所以,不能在子函数中对传入的字符串进行初始化,除非字符串的长度也作为参数传入到了子函数中。
4、不要在子函数中对结构体指针用sizeof
如果把一个结构体(如struct st_girl stgirl)的地址传给子函数,子函数用一个结构体指针(如struct st_girl *pgril)来存放传入的结构体的地址,如果在子函数中用sizeof(pgirl),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。正确的用法是用sizeof(struct st_girl)。
三、获取视频教程
百万年薪程序员录制,《C/C++高性能服务开发基础》视频教程已在CSDN学院发布,优惠价12元,地址如下:
https://edu.csdn.net/course/play/29402
四、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道
如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢。
sizeof运算符介绍以及常见的坑相关推荐
- mysql left join 查询_MySQL联表查询基本操作之left-join常见的坑
概述 对于中小体量的项目而言,联表查询是再常见不过的操作了,尤其是在做报表的时候.然而校对数据的时候,您发现坑了吗?本篇文章就 mysql 常用联表查询复现常见的坑. 基础环境 建表语句 DROP T ...
- C++primer 第 4 章 表达式 4.7条件运算符 4.8位运算符 4.9 sizeof运算符 4.10逗号运算符 4.11类型转换 4 . 1 2 运算符优先级表
4.7条件运算符 条件运算符(?:)允许我们把简单的if else逻辑嵌入到单个表达式当中,条件运算符按照如下形式使用: cond ? expr1 : expr2;其中cond是判断条件的表达式,而e ...
- c语言中sizeof是一个标准库函数,对C语言中的sizeof的介绍分析
对C语言中的sizeof的介绍分析 引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是百分网小编分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读! 1.定义 sizeof是C ...
- 坑爹系列:sizeof运算符
C语言里的sizeof关键字用于返回变量的类型宽度(变量所占的字节个数).例如: #include <stdio.h> int main() { int i = 0; int size = ...
- C++ sizeof 运算符的使用
sizeof 是C++ 中 唯一的一个带字母的运算符, sizeof 的功能: 返回指定的数据类型或者表达式值的数据类型在内存中所占的字节数. sizeof 运算符的使用 1 sizeof(类型) ...
- c++中利用sizeof运算符计算结构体大小问题探讨
c++中提供的sizeof运算符可以方便得计算出内置类型的字节数大小,比如sizeof(int),sizeof(char),sizeof(double)的返回值分别为4,1,8,这是很容易理解的.但是 ...
- python sizeof函数_C++ sizeof 运算符 | 菜鸟教程
C++ sizeof 运算符 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小. sizeof 运算符可用于获取类.结构.共用体和其他用户自定义数据类型的大小. 使用 ...
- C语言sizeof运算符
C语言并没有规定各种类 占用存储空间的大小,而是根据操作系统的位数来确定 同一种数据类型,在不同的编译系统中所占空间不一定相同 比如,在16位的编译系统中,int类型占用2个字节,而在32位的编译系统 ...
- c语言 sizeof size_t,C/C++中的sizeof运算符和size_t类型的详解
sizeof的作用 sizeof是c的运算符之一,用于获取操作数被分配的内存空间,以字节单位表示. 这里指的操作数,可以是变量,也可以是数据类型,如int,float等.所以就可以通过它来获取本地c库 ...
最新文章
- AUTOML 和 NAS 的真谛
- H5 中的 new FileReader() 以及 识别上传的文件是否为图片
- 阿里云天池发布完整开源数据集!实测可下!
- php artisan 出错,Laravel 5.2 php artisan migrate:回滚错误
- linux mysql8配置文件_Linux下 MySQL8安装教程
- SUSE12系统安装及LVM设置详解
- VScode快捷键(持续更新)
- 群发功能java_利用java实现邮箱群发功能
- C语言const:禁止修改变量的值
- 清华linux网络编程视频,清华大学视频课件:基于Linux的C++(自主模式)
- 麒麟下适配mellanox网卡驱动
- 12C新特性--Application Continuity
- 用python把图片换成蓝底_详解Python给照片换底色(蓝底换红底)
- 利用电子邮件“钓鱼”的常见手段
- 用matlab代码写一下jackknife方法的校正步骤?、
- OAuth2.0 里面的 state 参数是干什么的?
- css盒模型(css盒模型包括)
- 清洁机器人--音频方案之基于国民MCU IO控制的唯创WT588 语音播放方案
- 《视频解密》中文版(第四版) 第七章 数字视频处理(第二部分)
- 如何设计一个PC客户端的架构
热门文章
- 1900页Python系列PPT分享七:文件操作(132页)
- leetcode_150. 逆波兰表达式求值
- 计算机科技英语论文,计算机科技英语论文.doc
- python3导入ssl报错_python3中pip3安装出错,找不到SSL的解决方式
- linux切换至root权限,【linux】sudo su切换到root权限
- 82c55单片机c语言,AT89S51单片机与82C55的接口设计编程
- ios 重复引用 静态库_Swift 制作静态库
- vue checkbox双向绑定_Vue的双向绑定
- java类加载器正确的是_Java面试题:面向对象,类加载器,JDBC, Spring 基础概念
- 跑步呼吸方法(细胞分裂呼吸法)