首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么联合的大小不是8个字节,而是4个字节,即使我在联合中使用指针?

联合(union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。联合的大小取决于其成员中占用空间最大的成员的大小。

在C语言中,指针的大小通常是4个字节(32位系统)或8个字节(64位系统),因为指针存储的是内存地址,而内存地址的大小与系统的位数相关。因此,即使在联合中使用指针作为成员,联合的大小仍然取决于指针的大小。

联合的大小为其成员中占用空间最大的成员的大小,这是为了确保联合能够容纳最大的成员。如果联合中的成员包含指针,指针的大小是固定的,不会根据指针指向的数据类型而改变。

需要注意的是,联合中使用指针作为成员可能会导致一些问题。由于联合只能同时存储一个成员的值,当使用指针时,联合只能存储指针的值而不是指针指向的数据。这可能导致潜在的内存访问错误或数据丢失。因此,在使用联合时,需要谨慎处理指针成员,确保正确地使用和访问指针指向的数据。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云联合云服务器(Elastic Cloud Server,ECS):提供可弹性伸缩的云服务器实例,满足不同业务需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(Tencent Kubernetes Engine,TKE):基于Kubernetes的容器管理服务,提供高可用、弹性伸缩的容器集群。详情请参考:https://cloud.tencent.com/product/tke
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言进阶——自定义类型

让我们一起进入更深层次数据世界吧! 小小精灵球蕴含复杂类型 ---- 正文    本篇文章将会给大家介绍几种自定义类型:结构体、位段、枚举、联合体。...16 字节 return 0; }   显然,最终结果不是我们预想13字节而是更大16字节,编译器为什么会有这种浪费空间行为呢?...,即 enum tag { }; 值得一提是,枚举成员变量定义时,不是以分号 ; 结尾而是以逗号 , 区分,并且最后一个枚举成员不用加任何符号,关于枚举常量大小(标准未定义),VS是4字节...由此可知,联合成员变量共用一块内存空间,比如其中定义了一个字符型和一个整型,最终联合大小为4字节(一个整型大小),联合也有内存对齐,不过不像结构体那样严格,联合进行内存对齐时,会判断此时所占字节数是否为其中最大对齐数倍数...,这也就是为什么有时候通过内存调试,发现数据与预想不一样原因(因为是按小端字节序储存),我们可以自己程序来判断当前机器大小端,普通解法以前已经介绍过了,如今我们可以利用联合体巧妙判断大小端。

37320

打造坚实基础:C语言结构体、联合体和枚举

结构体定义和用途 首先我们需要知道,结构体是什么,为什么要用结构体? 在编程,特别是像C和C++这样语言中,结构体(struct)是一种用于创建复合数据类型工具。...我们来分析 c1为零偏移量,s3占十六个字节,但对齐位置则在8倍数上即可, d对齐8倍数,从24开始 总大小及为最大对齐数(8)整数倍,最终大小为32 为什么会有内存对齐?... C 语言中,位段(Bitfields)是一种数据结构,允许你为结构体成员分配一个特定数量位(bit),而不是分配完整字节。...char 数组使用了5个字节,所以联合大小至少是5字节。...不同系统或不同编译器设置,同一个联合大小可能有所不同。 联合一个练习! 写一个程序判断是大端还是小端?

13010
  • 【C语言】自定义类型(结构体、位段、枚举、联合体)

    例如某些平台默认一次访问2个字节或4个字节或8个字节。 性能原因:栈区我们应该尽可能自然边界上对齐。.../8个字节大小,对栈区使用率是比较低。...,内存使用方式 1.vs环境,char类型存储时,内存使用方式是先用掉字节低位,再用掉字节高位,当字节剩余比特位不够时,操作系统会开辟新字节用于存储位段成员 2.vs环境,int类型存储时...,内存使用方式是先用掉字节低位,再用掉字节高位,它不会浪费剩余比特位,而是紧紧利用每一个比特位去存储我们变量,先用低位再用高位 2.2.3位段内存分配练习题(做题之前要好好看2.2.2) 题目...return 0; } 由运行结果可以看出,联合体类型创建变量,变量所包含成员地址都是相同,而且联合体类型大小,是变量所包含成员类型所占字节数最大数,种种迹象表明,联合体变量所包含这些成员是共用一块空间

    57830

    OC对象原理(二)

    功能是:获得能够容纳所建立最大对象内存大小。 如果传进来是OC对象指针,我们知道,OC对象指针大小就是8字节,因此就是8字节。...也许你会有一个疑问,为什么参考因素是对象成员时候是8字节对齐,而参考因素是对象时候就是16字节对齐呢?...因为一个字节有8位,即00000000,如果只需要存储一个布尔值,即非0即1,我们没有必要使用8位只需要使用1位即可(0表示no ,1表示yes)。...因此,就可以定义一个char类型(char是一个字节),一个char有8位,我们就可以使用这8位后4位来分别定义前后左右了。这样就能节省很多内存空间。...isa联合,类结构绑定 上面我们有提到,nonpointerisa指针,会有一个shiftcls来存储类指针,即绑定对应类地址。

    73510

    对象原理探究(二)

    最后按照内部最大成员大小(double,8字节)倍数补齐,因此NormanStruct1大小是24。 NormanStruct2为什么是16: b-8,c-4,a-1,d-2。...其参考因素是整个对象,因此必须是16字节对齐。 也许你会有一个疑问,为什么参考因素是对象成员时候是8字节对齐,而参考因素是对象时候就是16字节对齐呢?...因为一个字节有8位,即00000000,如果只需要存储一个布尔值,即非0即1,我们没有必要使用8位只需要使用1位即可(0表示no ,1表示yes)。...因此,就可以定义一个char类型(char是一个字节),一个char有8位,我们就可以使用这8位后4位来分别定义前后左右了。这样就能节省很多内存空间。...isa联合,类结构绑定 上面我们有提到,nonpointerisa指针,会有一个shiftcls来存储类指针,即绑定对应类地址。isa初始化代码如下: ?

    38510

    C语言结构体、联合与枚举类型

    ,在这里需要注意是typedef关键字要写在结构体声明之前,重命名要写在大括号之后分号前,之后使用重命名+结构体变量是不是方便许多了呢?...二、联合体(共用体) 1.什么是联合体,以及如何定义联合体? 进行某些算法C语言编程时候,需要使几种不同类型变量存放到同一段内存单元。也就是使用覆盖技术,几个变量互相覆盖。...sizeof(s));//打印联合大小 printf("s地址: %p\n",&s);//打印联合体地址 printf("ch地址: %p\n",s.ch);//打印联合ch成员地址...其实,上面已经说了,联合成员是指向同一片内存空间,与结构体不同,结构体是每个成员有自己单独开辟空间,所以,联合使用时候尽量不要多个成员一起使用,除非使用成员占用内存大小要小于等于最大成员所占内存空间大小...由sizeof(s)可以看出来这个联合体占用八个字节,我们来分析这个联合体,由一个字符数组与整型变量,其中字符数组大小为6个字节,又联合默认对齐数为4个字节,所以成员列表中最大成员占用6个字节,又成员变量占用字节数必须是默认对齐数整数倍

    11410

    自定义类型详解

    struct Node { int data; struct Node* next;//结构体指针大小是4/8个字节 }; 变成指针后,结构体大小就固定可算了,详细知识涉及到数据结构链表知识,...后面再进行讲解 因此,结构体,结构体自引用不是结构体里面包含同类型结构体变量,而是包含同类结构体指针。...,四个字节 联合体(共用体) 联合特点 联合成员是公用同一块内存空间,这样一个联合变量大小,至少是最大成员大小(因为联合至少得有能力保存最大那个成员)。...同一时间,只能使用一个成员,因为它成员共用一块空间,所以改动一个也会导致其他成员发生改变。 什么时候使用联合体(共用体)呢:允许成员公用一块空间,并且共用一块空间时不会影响整体使用。...联合大小计算 1.联合大小至少是最大成员大小  2.当最大成员大小不是最大对齐数整数倍时候,就对齐到最大对齐数字整数倍 计算实例  #include union Un {

    8310

    抽丝剥茧C语言(高阶)结构体,枚举,联合+练习

    1.4 结构自引用 结构包含一个类型为该结构本身成员是否可以呢?...那么我们可以放进去一个指针,指向下一个同类型结构体地址,这样就能确定结构体大小了。...这里用32位机器举例子,因为32位就是4个字节,所以从头开始读,一下子就会跳过4个字节,如果这两个内存,想读int类型,第一个从头开始,发现不是int类型直接跳过4个字节读取就可以了,但是第二个从头开始发现这...3.2 枚举优点 为什么使用枚举? 我们可以使用 #define 定义常量,为什么非要使用枚举?...当最大成员大小不是最大对齐数整数倍时候,就要对齐到最大对齐数整数倍。

    39700

    【C语言】自定义类型详解:结构体、枚举、联合

    3、枚举优点 4、枚举使用 三、联合 1、什么是联合 2、联合声明 3、联合特点 4、联合大小计算 5、利用联合判断大小端 前言 C语言数据类型包括基本类型(内置类型)、构造类型(自定义类型...Node Next,而Next又会包含一个struct Node next,这样无限套娃,使得我们无法计算这个结构体大小;正确结构体自引用应该是一个结构体包含指向该结构体指针,如下所示:...正确自引用方式 struct Node { int data; struct Node* next; }; 一个结构体包含了一个指向该结构体指针,实现了结构体自引用,同时,由于指针大小是固定...5、VS下位段使用习惯 这里直接说结论,VS编译器下,位段使用习惯是这样: 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余位时,直接舍弃剩余位; 位段成员在内存是从右向左分配...4、联合大小计算 联合大小计算规则如下: 联合大小至少是最大成员大小。 当最大成员大小不是最大对齐数整数倍时候,要对齐到最大对齐数整数倍。

    74400

    【C语言】自定义类型:联合体和枚举

    ⼤成员大小,确保联合大小可以装下每一个单一成员 当最⼤成员大小不是最大对齐数整数倍时候,就要对⻬到最⼤对⻬数整数倍 例1    还是老方法,实践出真知,我们举一个例子来说明这两条规则: #include...,大小是5个字节,所以根据第一条规则,这个联合大小至少是5个字节    然后就是第二条规则,这条规则需要查看这个联合最大对齐数,联合大小必须是最大对齐数倍数,而联合体成员c对齐数为1..."); return 0; } 运行结果:    接下来我们就来看如何使用联合体实现这个功能    其实很简单,上面案例本质就是利用指针来访问整型a第一个字节,而我们联合体本身就可以做到这一点...我们继续学习 6.联合应用    联合使用时可以节省空间,所以我们要学习什么情况下使用联合体,而不是使用结构体    由于它特性,所以我们应该也能想到它应用,那就是应用在整个联合体一次性只会出现一个成员情况下...,只能在函数内使用,而#define定义常量是全局变量 所以枚举也是有它自己优点 3.枚举类型使用    使用枚举时,我们会创建一个枚举变量,然后用枚举类型枚举常量给它赋值,如下: #include

    6610

    mysql索引

    这里想从查询效率和查询稳定两方面来说 查询效率这里 首先innoDB一定会存在聚簇索引, 只叶子结点存数据,而不存放指针,那么一个页就可以大小会更多些,内存与磁盘次数会少些 同时叶子结点只存放数据...而B+树是一种磁盘io友好型数据结构,刚才说叶子结点设计,有序链表构建都减少io 为什么使用红黑树?...首先, B+树一个叶子,大小为16kb,对于4个操作系统页,假设一行数据1kb, 那么一个叶子结点就是16行数据 非叶子结点:存放主键和指针 主键类型bigint 占用8字节,innoDB指针占用6字节...会选择到这个符合条件111,此时做一次回表就可以了, 尤其是模糊查询时候,能大大提高效率。这是mysql做一个优化 索引下推和索引覆盖并不是索引,而是两种优化。...age = 15 and phone = 124124213 此时这个联合索引并不是覆盖索引,因为字段name,不属于联合索引test构建好B+树, select age,phone from

    27240

    记一次阿里实习生电面经历

    以前时候Linux编程(POSIX)IP地址结构体(struct in_addr)就是一个联合(也可能是结构体成员是联合),比如成员是4个元素char数组,两个元素short数组,或一个int...内存 问:“比如你malloc了一段内存,它地址不是内存对齐,如何实现8字节内存对齐?”...虽然理论上malloc返回值可以转化为任意指针类型比如:int *。但是要注意到指针加减操作,所偏移单位是指向类型大小。...这也是为什么我们通常把malloc返回值转换为char *而不是int *原因。 8. 回调函数 问:“C++如何实现回调函数” 回调函数,挺熟名字,callback。。。...记得安卓里面见到过。就扯了一下安卓。。 问:“那么C++该如何实现呢” 接下来,确实也是运气。脑袋里冒出个函数指针,就脱口而出了,说了个一般函数指针用法。貌似说对了。

    44410

    sizeof,终极无惑(上)

    所以32位计算机,一个指针变量返回值必然是4(注意结果是以字节为单位),能够估计,将来64位系统中指针变量sizeof结果为8。...sizeof值与指针所指对象没有不论什么关系,正是因为全部指针变量所占内存大小相等,所以MFC消息处理函数使用两个參数WPARAM、LPARAM就能传递各种复杂消息结构(使用指向结构体指针)。...} 或许当你试图回答c4值时已经意识到c3答错了,是的,c3!=3。这里函数參数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么?...为什么受伤总是?...对于上面的准则,有几点须要说明: 1) 前面不是说结构体成员地址是其大小整数倍,怎么又说到偏移量了呢?由于有了第1点存在,所以我们就能够仅仅考虑成员偏移量,这样思考起来简单。想想为什么

    37110

    offset size_c语言sizeof求结构体长度

    大家好,又见面了,是你们朋友全栈君。 sizeof与offsetof程序中经常遇到,但在面试其应用使得许多小伙伴吃闭门羹,被面试官问得哑口无言。接下来对两者应用做详细介绍。...一般32位编译环境,sizeof(int)取值为4。 指针变量sizeof 学过数据结构你应该知道指针是一个很重要概念,它记录了另一个对象地址。...既然是来存放地址,那么它当然等于计算机内部地址总线宽度。所以32位计算机,一个指针变量返回值必定是4(注意结果是以字节为单位),64位系统中指针变量sizeof结果为8。...这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3数组吗不会!...对于上面的准则,有几点需要说明: 1) 前面不是说结构体成员地址是其大小整数倍,怎么又说到偏移量了呢因为有了第1点存在,所以我们就可以只考虑成员偏移量,这样思考起来简单。想想为什么

    68010

    【c语言】轻松拿捏自定义类型

    这里使用了“ . ”操作符来访问结构体成员变量。如果是结构体指针类型,访问成员变量时,则要解引用之后再使用“ . ”操作符或者使用“->”操作符。...注意:匿名结构体类型只能使用一次,无法主函数创建该结构体新变量。...按理来说,char占一个字节,int占四个字节,这个结构体总共应该占5个字节。那么真实结果是这样吗?我们看看运行结果: 为什么是8个字节不是5个呢?这就需要我们学习一个概念:结构体内存对齐。...而传递结构体指针时,函数只开辟了4/8个字节内存空间。 二、联合体 在学习了结构体之后,我们来了解一下联合体。...2.当最大成员大小不是最大对齐数整数倍时候,它就要对齐到最大对齐数整数倍处。 4.联合使用 联合体可以用于判断当前机器大小端。

    10810

    【C语言】数组&&结构体&&枚举&联合详解

    ,保存在内存高地址 1.2.2.2 为什么会有大端和小端 为什么会有大小端模式之分呢?...这是因为计算机系统,我们是以字节为单位,每个地址单元 都对应着一个字节,一个字节为8 bit。...struct S s; strcpy(s,name, "zhangsan");//使用.访问name成员 s.age = 20;//使用.访问age成员 3.5.2 结构体指针访问指针变量成员 有时候我们得到不是一个结构体变量...{ char c; int i; }; 联合成员,同一时间只能使用一个 5.2 联合特点 联合成员是公用同一块内存空间,这样一个联合变量大小,至少是最大成员大小(因为联合至少得有能力保存最大成员...) 5.3 联合大小计算 联合大小至少是最大成员大小 当最大成员大小不是最大对齐数整数倍时候,就要对齐到最大对齐数整数倍

    14710

    C语言重点突破(四)自定义类型详解

    接下来是int类型,在内存占4个字节,但0下一位就是1,不是4整数倍,根据对齐规则,就得对齐到4位置进行存放4个字节。 最后是char,和第一个一样,直接存放下一个(8)即可。...现在结构体占大小是0~8,一共九个字节,而结构体成员最大对齐数是4,还得对齐到4整数倍上才能算结构体大小,就是12.  很多人会有疑问了,为什么会存在内存对齐这种说法呢?...6.结构体实现位段(位段填充&可移植性) 位段是一种数据结构,它允许程序员在内存为字段指定特定数量位数,而不是字节为单位。这样做有时可以节省内存空间。...2.联合特点 联合成员是共用一块内存空间,所以一个联合变量大小,至少是最大成员大小。...3.联合大小计算 要注意问题: 1.联合大小至少是最大成员大小 2.当最大成员大小不是最大对齐数整数倍时,就要对齐到最大对齐数整数倍。

    20810

    【C语言】自定义类型之联合和枚举

    前言 之前博客中介绍了自定义类型结构体,有想了解可以点这个链接:link 今天来分享另外两种类型:联合和枚举。 2....4个字节,这是为什么呢?...同一个时间点只能使用一个联合体成员。 2.2 联合特点 联合成员是共用同一块内存空间,这样一个联合变量大小,至少是最大成员大小(因为联合⾄少得有能力保存最大那个成员)。...2.4 联合大小计算 当最大成员大小不是最大对齐数整数倍时候,就要对齐到最大对齐数整数倍。 举个例子:计算下面两个联合大小?...2.4 判断当前机器大小之间博客中有说明,这里就不过多讲述,有需要可以查看; link 之前所写代码是利用指针来判断: int main() { int a = 1; if (

    12210

    C语言进阶(六)--自定义类型详解(结构体+枚举+联合)

    char c2占一个字节,对齐数为1. int i 占4个字节,vs环境下他对齐数为4,所以他地址要从4倍数开始储存。 此时结构体大小是8个字节,为最大对齐数4倍数。...3.枚举优点 为什么使用枚举? 我们可以使用 #define 定义常量,为什么非要使用枚举?...如果有多个成员,使用c时候,i值也会发生相应变化,使用i时候,c值也会发生相应变化,所以这两个变量不能同时使用。 举一个例子: 当联合存储两个不同值时,内存结果是显示。...那么 为什么呢? ? u=0x55 改变了原来 i 字节44存储,所以共用一块空间结构体成员使用时会互相影响。...3.联合应用 面试题 判断当前大小计算机大小端存储   之前博客,博主已经详细介绍了大小概念以及如何查看计算机内存是大端存储还是小端存储。

    62330
    领券