c语言 sizeof详解

【C语言】运算符——sizeof sizeof是C语言中的运算符,并不是函数用于在编译时确定类型(直接将大小计算结果嵌入生成的代码中,不会引起运行时开销。)或变量的大小(以字节为单位)。它的结果类型是 ‘size_t’,这是一个定义在 文件中的无符号整数类型,专门用于表示对象的大小。‘sizeof’ 运算符在C语言中有许多应用,理解其用法对于编写高效和正确的C代码至关重要。 阅读详情

sizeof的概念  

  sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
    它并不是函数。
    sizeof操作符以字节形式给出了其操作数的存储大小。
    操作数可以是一个表达式或括在括号内的类型名。
    操作数的存储大小由操作数的类型决定。 

sizeof的使用方法  

  1、用于数据类型    
  sizeof使用形式: sizeof(type)
  数据类型必须用括号括住: sizeof(int)

  2、用于变量    
  sizeof使用形式: sizeof(var_name) 或 sizeof var_name    
  变量名可以不用括号括住.如sizeof (var_name),sizeof var_name等都是正确形式
    带括号的用法更普遍,大多数程序员采用这种形式。    
  注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
     不完全类型指具有未知存储大小的数据类型,
     如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。    
    例如: sizeof(max)     
--
若此时变量max定义为int max();
      sizeof(char_v)     --若此时char_v定义为char char_v[MAX]且MAX未知,
      sizeof(void)      
     以上都是不正确形式。

sizeof的结果

  1、ANSI C正式规定字符类型为1字节。    
    sizeof(char)= 1;
    sizeof(unsigned char) = 1;
    sizeof(signed char)= 1;
  
  2、其他类型在ANSI C中没有具体规定,大小依赖于实现。
    sizeof(int)= 4;
    sizeof(unsigned int)= 4;
    sizeof(short int)= 2;
    sizeof(unsigned short) = 2;
    sizeof(long int)= 4;
    sizeof(unsigned long)= 4;
    sizeof(float)= 4;
    sizeof(double)= 8;
    sizeof(long double)= 12; //gcc 32-bit 编译器
    sizeof(long double)= 16; //gcc 64-bit 编译器

  3、当操作数是指针时,sizeof依赖于编译器。
    学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),在64位系统中指针变量的sizeof结果为8。
       例如: char *p;      
           sizeof(p) = 4;//gcc 32-bit 编译器
           sizeof(p) = 8;//gcc 64-bit 编译器     
 
  4、当操作数具有数组类型时,其结果是数组的总字节数。
    例如: char a[5];
        int  b[5];
        sizeof(a) = 5;
        sizeof(b) = 20;
   
  5、当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
      例如: sizeof(8)    = 4;  //自动转化为int类型
          sizeof(8.8)  = 8;  //自动转化为double类型,注意,不是float类型
          sizeof("ab") = 3   //自动转化为数组类型,
                                   
  6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。还是拿例子来说话:
   union u{             //对union来说
       char c;
       double d;
     }u;
    sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;
  struct a{             //对struct来说
       char b; 
       double x;
    }a;   
   sizeof(a) = 16;  而一般sizeof(char) + sizeof(double) = 9; 
  这是因为编译器在 考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节, 达到8个,这时候偏移量为8,放上x后长度为16。

struct S1 {
		char c;
		double d;
	};
	union  u {            //对union来说
		char c;
		double d;
	} u;
	int a;
	char b;
	short c;
	double d;
	float f;
	int *p;
	char a1[]="abcd";
	int a2[3];
	printf("int=%d\n",sizeof(a));
	printf("char=%d\n",sizeof(b));
	printf("short=%d\n",sizeof(c));
	printf("double=%d\n",sizeof(d));
	printf("float=%d\n",sizeof(f));
	printf("指针=%d\n",sizeof(p));
	printf("数组=%d\n",sizeof(a1));
	printf("数组=%d\n",sizeof("ab"));
	printf("结构体=%d\n",sizeof(S1));
	printf("联合类型=%d\n",sizeof(u));
gcc 64-bit 编译器,指针=8;
gcc 32-bit 编译器,指针=4


类的sizeof

面试中遇到面试官让我求一个类的sizeof,里边有各种类型的变量,还有虚函数(但是不懂什么是虚函数)。如果有虚函数就要加上一个指向虚表的指针,4字节大小(32 位 编译器),64位编译器是8字节大小。
1、空类
class A{}; sizeof(A)=1;
求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
2、简单的类
class A{
	int a;
    	double b;
};
本来sizeof(A.a)+sizeof(A.b)=12;结果=16,说明类的大小也遵守类似struct字节对齐的补齐规则,补齐为double类型8字节,所有为16
3、含虚函数的类
class A{
	int a;
	virtual  fun();
};
//sizeof(A)=8+8=16   (gcc-64bit编译器,指针大小为8字节)+补齐规则
//sizeof(A)=4+4=8   (gcc-32bit编译器,指针大小为4字节)

3、子类继承父类,含虚函数
class Base
{
public:
	Base();                
	virtual ~Base();         //每个实例都有虚函数表
	void set_num(int num)    //普通成员函数,为各实例公有,不归入sizeof统计
	{
		a=num;
	}
private:
    int  a;                  //占4字节
    char *p;                 //4字节指针
};

class Derive:public Base
{
public:
	Derive():Base(){};     
	~Derive(){};
private:
	static int st;         //非实例独占
   	int  d;                     //占4字节
   	char *p;                    //4字节指针

};
gcc-32bit编译器
sizeof(Base)=12;
sizeof(Derive)=20
sizeof(Derive)=sizeof(Base)+sizeof(Derive.d)+sizeof(Derive.p) 的指针即可;
gcc-64bit编译器
sizeof(Base)=24; //补齐规则
sizeof(Derive)=40
sizeof(Derive)=sizeof(Base)+sizeof(Derive.d)+sizeof(Derive.p)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向虚表
4.子类虚继承、父类含虚函数
class Base
{
public:
	Base();                
	virtual ~Base();         //每个实例都有虚函数表
	void set_num(int num)    //普通成员函数,为各实例公有,不归入sizeof统计
	{
		a=num;
	}
private:
    int  a;                  //占4字节
    char *p;                 //4字节指针
};

class Derive:virtual public Base
{
public:
	Derive():Base(){};     
	~Derive(){};
private:
	static int st;         //非实例独占
   	int  d;                     //占4字节
   	char *p;                    //4字节指针

};

sizeof(Derive)=sizeof(Base)+虚函数指针(指示父类存放空间的起始偏移量)+sizeof(Derive.d)+sizeof(Derive.p)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。

类的sizeof总结:
1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。
2.普通成员函数与sizeof无关。
3.虚函数由于要维护在虚函数表,所以要占据一个指针大小字节。
4.类的总大小也遵守类似struct字节对齐的,调整规则。


参考:http://blog.youkuaiyun.com/hairetz/article/details/4171769
http://blog.sina.com.cn/s/blog_728161840100u2ib.html


【C语言】sizeof 关键字详解 sizeof运算符是C语言中一个非常有用的工具,可以在编译时确定数据类型或变量的大小。 阅读详情

相关推荐

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 306

c语言中sizeof详解

解析C语言中的sizeof 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法1、用于数据类型 sizeof使用形式:sizeof(type)   数据类型必须用括号括住。如sizeof(int)。 2、用于变量 sizeof使用形式:sizeof(var_name)或..

团长的专栏 13万+

S32K144之芯片锁死解锁——进入HardFault

S32K144之芯片锁死解锁——进入HardFault 最近遇到因为软件代码问题导致进入HardFault,从而使芯片锁死,来简述具体现象以及最终的解锁方法。 导致原因:如下图,在进行Gpio的相关配置,case后面没有break语句,导致芯片进入HardFault。 现象1:reset引脚持续为低,reset指示灯常亮。如果掉电后重新上电,通过示波器抓取reset引脚的波形,会有510us左右或者29ms左右的低电平脉冲出现,一般会出现两三次左右并且没有规矩,持续几秒的高电平之后,reset脚再次被拉低

weixin_41935674的博客 8273

C语言:关键字---sizeof(计算存储空间)

sizeof是一个“披着函数皮的关键字”,是一种单目操作符,绝对不是函数。 一、sizeof 简介 1. 一般形式 sizeof(对象); sizeof(object); 注意:除了数据类型,其他的对象可以不用括号,这也是sizeof不是函数最有力的证明。 2. 功能 返回一个对象在内存中所占中的存储空间,以字节为单位计数。 对象包括:变量、基本数据类型、数组、指针和结构体等。 二、sizeof 用法 1. 变量 2. 基本数据类型 3. 数组 4. 指针 5. 结构体 ...

MQ0522的博客 1万+

【一键搞定】ThinkPHP6.0.2+PHPStudy+Composer极速安装指南——附完整下载包与避坑技巧

本文提供了一份ThinkPHP6.0.2的完整下载包,并详细介绍了如何配合PHPStudy和Composer进行极速安装与配置。指南涵盖了环境准备、Composer国内镜像加速、项目部署及常见避坑技巧,旨在帮助开发者,尤其是内网或网络不佳的用户,快速搭建可运行的TP6开发环境,绕过依赖下载的繁琐步骤。

assembly8low的博客 1007

多物理场耦合仿真-主题032-电磁-流体耦合

电磁-流体耦合,即磁流体动力学(MHD, Magnetohydrodynamics),是研究导电流体在电磁场中运动规律的学科,涉及电磁场与流体力学的深度耦合。本主题系统阐述磁流体动力学的基本理论、控制方程和数值方法。首先介绍MHD的基本概念和物理基础,包括导电流体的性质、电磁场基本方程;然后详细推导MHD控制方程组,包括连续性方程、动量方程、能量方程和电磁场方程;接着讨论MHD流动的特征参数,如Hartmann数、磁雷诺数、相互作用参数等;最后通过六个典型工程案例展示MHD分析的实际应用,包括电磁泵、磁流体

2401_87715305的博客 424

C语言中的sizeof()

一、sizeof概念: sizeof是C语言的一种单目操作符 sizeof操作符以字节形式给出了其操作数的存储大小。 二、sizefo的使用方法 1.用于数据类型 例如:sizefo(int)——表示int类型的储存大小 常见数据类型储存大小 数据类型 存储大小(单位:字节) char 1 short 2 int 4 long 4 long long 8 float 4 double 8 2.用于变量 例如:s.

m0_61345222的博客 3309

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

c语言sizeof啥作用,C语言中sizeof什么意思

C语言中“SIZEOF(INT)“是什么意思?有什么作用?C语言中,sizeof是一个?sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符;sizeof是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占的字节个数; 用法: #include int main() { int l; char a1[] = "abc"; l=sizeof( a1 ); printf("%d...

weixin_33196828的博客 1万+

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1107

c语言中sizeof()用法的详解

sizeof是C语言和C++的关键字和操作符,sizeof 不是操纵符,也不是函数,因为在运行阶段没有它,它没有被编译成机器指令。它的作是用来计算变量(或数据类型)在当前系统中占用内存的字节数。sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

qq_63168095的博客 8675

YOLO26-seg分割优化:卷积魔改 | 动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

​​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 217

C语言中的sizeof的用法详解

转载:http://blog.sina.com.cn/s/blog_62d3a73a0100li1e.html 一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法   1、用于数据类型   sizeof使用形式:sizeof(type)   数据类型必须用括号括住。如siz

shanweikezhang的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言Sizeof()

C语言数据类型C语言数据类型sizeof运算快捷键有助于目录的生成文本的样式链接与图片插入一段漂亮的代码片生成一个列表创建表格Pants创建一个列表创建一个注脚注释甘特图功能,丰富你的文章图表流程图导入出入 C语言数据类型 C语言中在使用一个变量前需要对变量进行声明,声明的同时要确定变量的数据类型。C语言中的数据类型有: char、 short、 int、 long、 long long flo...

weixin_43814616的博客 7126

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言sizeof 详解

1、sizeof是C语言的一个操作符,类似于++、–等。sizeof能够告诉我们编译器为某一特定数据或者某一个类型的数据在内存中分配空间时分配的大小,大小以字节为单位。基本用法为: 1、sizeof(变量); 2、sizeof 变量; 3、sizeof(类型); 2、注意点: (1)sizeof返回的占用空间大小是为这个变量开辟的大小,而不只是他用到的空间。所以对结构体用的时候,大多情况下就得考...

SZU_黄其才 7545

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言之sizeof

在 C 语言中,sizeof是一个(而不是函数),用于获取一个变量或数据类型所占用的内存字节数。它在编译时就会被计算,因此是一个,不会在程序运行时产生开销。

weixin_66709931的博客 1634

sizeof 在C语言的作用,C语言中的sizeof的用法详解

C语言中的sizeof的用法详解一、sizeof的概念sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。二、sizeof的使用方法1、用于数据类型sizeof使用形式:sizeof(type)数据类型必须用括号括住。如sizeof...

weixin_42358539的博客 5378

c语言中sizeof函数的作用是,c语言中sizeof函数的用法

C语言sizeof函数如何使用?怎样利用sizeofCSS布局HTML小编今天和大家分享各种数据类型占用的字节数?(1)sizeof不是函数,它只是一个操作符(operator)。 (2)sizeof的作用是返回一个对象或者类型所占的内存字节数,它的返回值的类型是size_t类型,而size_t是在头文件stddef.h中定义的。size_t 这是一个依赖于编译系统的值。C语言中的sizeof是一...

weixin_34061241的博客 3794

C语言中sizeof用法详解

文章转载自:http://bbs.ednchina.com/BLOG_ARTICLE_268624.HTM 大部分公司在招聘技术职位中,面试的时候,都会考大家的c语言基础,而sizeof是他们最喜欢考的知识点,现总结如下:   1. 定义:   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大

优雅黑曼巴的专栏 7415

C语言:sizeof用法

2022-12-01:sizeof用法

立于皓月之边,不弱星光之势 1万+

C语言 sizeof总结

一、sizeof用来计算一个变量,或者数据类型的长度,以字节为单位。 它是一个操作符,如同++,--一样,单操作数。 比如在我的电脑上,sizeof(int)=4,sizeof(long)=4。还有一般要求的sizeof(char)=1。 二、sizeof在数组与指针上的特性 C语言中的指针使其具备了强大的功能,同时也造成了许多迷惑。众多迷惑中的一点是sizeof在对待数组与指针上的差

丰年留客的专栏 4万+

c语言详解sizeof

一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名。 操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式: sizeof(type)   数据类型必须用括号括住: sizeof(int) 2、用于变量 sizeof使用形式: sizeof(var_name) 或 sizeof var_name 

bnmqwe1的博客 1274

C语言中sizeof()的用法

语法 sizeof有三种语法形式: 1、sizeof(object); //sizeof(对象); 2、sizeof(type_name); //sizeof(类型); 3、sizeof object; //sizeof 对象; 基本数据类型的sizeof 等于各数据类型在内存中所占的字节数。这里的基本数据类型指的是short、int、long、float等简单的内置数据类型,由于它们和系统相关,所以取值在不同系统下可能会不同,可移植性较差。 如: #include <stdio.h> int

m0_51524792的博客 9565

c语言 sizeof_c语言详解sizeof

一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名。 操作数的存储大小由操作数的类型决定。  二、sizeof的使用方法   1、用于数据类型    sizeof使用形式: sizeof(type)...

weixin_39862697的博客 257

c语言sizeof怎么计算字节数,理解c语言的sizeof

c语言有很多用起来需要特别注意的地方,我们(计算机学习微信公众号:jsj_xx)以后会分析其中有使用价值的点。今天我们一起看看sizeof。c语言通过类型长度来达到指针的灵活性,我们觉得,某种意义上讲,是sizeof功能成就了c指针。基础知识首先,要知道sizeof 是关键字不是函数。也就是说,用到sizeof的地方其实在编译阶段就已经计算出结果了,不是(也不能)在程序运行时动态地计算。换句话说,...

weixin_33509600的博客 1万+
上一篇: 字符串转整型与整型转字符串
下一篇: 【笔试面试】简单总结笔试和面试中的海量数据问题
say_haha
博客等级 码龄13年 48粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值