首页 > 其他分享 >sizeof运算符介绍以及常见的坑

sizeof运算符介绍以及常见的坑

时间:2022-11-22 16:06:01浏览次数:47  
标签:struct 占用 常见 运算符 子函数 内存 sizeof void


文章目录

  • ​​一、基本概念​​
  • ​​二、注意事项​​
  • ​​1、sizeof(结构体)​​
  • ​​2、不要对void使用sizeof​​
  • ​​3、不要在子函数中对字符指针用sizeof​​
  • ​​4、不要在子函数中对结构体指针用sizeof​​
  • ​​三、获取视频教程​​
  • ​​四、版权声明​​

一、基本概念

sizeof是C语言的关键字,它用来计算变量(或数据类型)在当前系统中占用内存的字节数。

sizeof不是函数,产生这样的疑问是因为sizeof的书写确实有点像函数,sizeof有两种写法:

用于数据类型

sizeof(数据类型);

数据类型必须用括号括住。

printf("字符型变量占用的内存是=%d\n",sizeof(char));   // 输出:字符型变量占用的内存是=1
printf("整型变量占用的内存是=%d\n",sizeof(int)); // 输出:整型变量占用的内存是=4

用于变量

sizeof(变量名);
sizeof 变量名;

变量名可以不用括号括住,带括号的用法更普遍,大多数程序员采用这种形式。

int ii;
printf("ii占用的内存是=%d\n",sizeof(ii)); // 输出:ii占用的内存是=4
printf("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; // 身高,单位:厘米cm
char 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));
}

运行效果

sizeof运算符介绍以及常见的坑_内存大小

从上面的示例可以看出,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)。

作者:码农有道

标签:struct,占用,常见,运算符,子函数,内存,sizeof,void
From: https://blog.51cto.com/u_13748800/5878201

相关文章

  • 数据脱敏的 3 种常见方案,好用到爆!
    来源:blog.csdn.net/weixin_615948031.SQL数据脱敏实现MYSQL(电话号码,身份证)数据脱敏的实现--CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现--CON......
  • C语言三目运算符
    文章目录​​1、三目运算符​​​​2、获取视频教程​​​​3、版权声明​​1、三目运算符三目运算符也叫条件运算符、三元运算符,是由一个问号和一个冒号组成。语法:表达式1?......
  • PostgreSQL Win10 安装、创建表并添加数据(安装细节+常见错误避坑)
    1.下载:postgresql-14.5-1-windows-x64.exe  地址:DownloadPostgreSQL 2.安装:    下一步即可,注意记住期间设置的超级管理员密码和设置的端口号    ......
  • docker 常见操作
    1.开启mysqldockerrun--rm-itd-p3306:3306--restart=on-failure:3--namemysql-eMYSQL_ROOT_PASSWORD=123mysql:latestdockerexec-it<容器id>shmysql-uroo......
  • go module常见问题
    1.如何兼容GOPATH的旧项目,支持modulemodule名取github.com/****/projectNamegomodinitgithub.com/fwhezfwhez/errorxgomodtidy2.golang.org/x拉取不到怎么办使用r......
  • nginx常见问题
    前言本文记载一些nginx常见问题1.connect()fail转发的服务挂了,确保主服务正常运行。可以使用lsof-i:端口号确定被转接的服务的状态2.nginx50X的错误日志去哪看,配置......
  • 单元测试中常见错误
    单元测试中常见错误单元的常见错误一般出现在5个方面:代码的稳定、易读、规范、易维护、专业。因此,单元测试的关注的重点有5点:单元接口、局部数据结构、边界条件......
  • 常见问题解决方案
    1.Failedtofindthek3s-selinuxpolicy检查master机器上是否已经安装了不同版本的k3s-selinux或者selinux-policy工具包,建议将机器上相关包全部卸载以后重新执行安装。......
  • 温故而知新——常见类&正则&分组&工具类&各种时间类
    拼图游戏(JFrame等等)x轴是竖轴y是横轴事件:1.鼠标事件2.获取键盘对应的值:美化界面的:将一维数组放到二维数组中(很妙):核心逻辑:移动图片常用的API(不需要......
  • 6:常见异常汇总和说明
    由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后。【示例】return和异常结构的正确处理方式deftest01():......