所以int原来低地址字节0x44被覆盖为0x55。 相同成员的结构体和联合体对⽐ 结构体和联合体的主要区别在于: 结构体中每个成员占用自己独立的内存空间,可以同时访问每个成员。...联合体⼤⼩的计算 点击可以查看结构体的内存对齐规则——>【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参 联合体大小计算规则: 联合的⼤⼩⾄少是最...联合体的对齐规则与结构体相似: 点击可以查看结构体的内存对齐规则——>【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参 联合体应用 使⽤联合体是可以节省空间的...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。...⽐,⼤⼩的计算,联合体应用,枚举类型的声明,优点和扫雷改造使⽤方法,阿森将下一节和你一起学习动态内存管理 。
这是初始化完i时,结构体内存的存储: 可以看到,这里VS用小端字节序的方式将i存放到了内存中,如果不知道什么是小端字节序,可以参考该文章:【C语言】数据在内存中的存储(万字解析) ...,大小是5个字节,所以根据第一条规则,这个联合体的大小至少是5个字节 然后就是第二条规则,这条规则需要查看这个联合体中的最大对齐数,联合体的大小必须是最大对齐数的倍数,而联合体成员c的对齐数为1...: 首先根据第一条规则,我们要看成员中,谁最大,很明显最大的就是c数组,占据14个字节,所以联合体Un2至少都有14个字节 然后来看第二个规则,我们要看成员中的最大对齐数,第一个成员c的对齐数是...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,比较浪费内存。...,是无法更改的,一般用来将这些值赋值给其它变量 2.枚举类型的优点 为什么使⽤枚举?
结构体和位段的内存分配我已经讲过了,下面带来联合体的内存分配 #include //联合类型的声明 union Un { char c; int i; }; int main() {...对于联合体的各个成员都是从联合体的首个字节开始进行存储(像联合体这种包含多个数据的类型内部都是从低地址到高地址进行存储,数组,结构体这种包含多个数据的也是同理)。从而会共用同一块内存空间。...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。...用联合体的方式判断大小端存储模式 int check_sys() { union { int i; char c; }un; un.i = 1; return un.c;//返回1是⼩端...枚举依然能像结构体和联合体一样在;前面创建变量(创建类型的同时创建变量) 这大概就是枚举的主要知识点,当然它还有更多的细节,对于这些细节我就不讲了(实在有点多),这里有篇好文我推荐下,大家可以去看下C
#include union Un1 { char c[5];//5 如果元素为数组,其按照类型计算对齐数1 8 1 int i;//4 4 8 4 }; union...Un2 { short c[7];//14 int i;//4 }; int main() { //下⾯输出的结果是什么?...printf("%d\n", sizeof(union Un1));//8 要浪费掉3个字节数与之对齐 printf("%d\n", sizeof(union Un2));//16 要浪费掉3个字节数与之对齐...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏⼤,比较浪费内存。...在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
前言 在上一篇文章中,小编将结构体的学习笔记整理出来了。现在,小编将枚举和联合体笔记分享给大家。...这里的c数组是char型,自身大小是1,vs默认对齐数是8,故数组c的大小为1 i是int型,vs默认对齐数是8,故i的大小是4 联合的最大对齐数是4,最大成员是5,显然5不是4的倍数 5后面只有...8是4的倍数 因此,输出结果为8 对Un2: 一个short类型是2个字节,现在有7个,那么一共14个字节 联合体中最大成员是14,最大对齐数是4,显然14不是4的倍数 14后面6是4的倍数...,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。...在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
联合体 1.1 联合体类型的声明 联合体和结构体类似,但是又结构体又不同,结构体中的每个成员都是独立的,修改其中任意一个值不会影响另外一个值,但是在联合体中,修改其中一个值,一定会有另一个值跟随他发生改变...,因此会开辟较大的那个数据所需的内存,在这段代码中开辟4个字节用来存放这两个数据。...{ //下⾯输出的结果是什么?...printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); return 0; } 第一个输出8,因为char型数组的对齐数是...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。
第一个字节是c,所有的4个字节都是i 所以我们发现i和c公用这4个字节的空间 所以联合体也叫共用体 我们可以发现,当我们用i的时候我们就不能用c 用c的时候就不能用i 因为改i的时候,c也改了 所以联合体成员在使用的时候...当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍 //union Un //{ // char arr[5];//对齐数是1 // //这个数组放在这里,跟放5个char...return 0; //} /* 计算出的是8,所以我们得知联合体的大小不一定是最大成员的大小 联合体的大小至少是最大成员大大小 这个联合体最大对齐数是4 那么联合体的总大小一定要是4的倍数 这个联合体最大成员的大小是这个数组...,大小是5,就是相当于5个char类型 但是5不是4的倍数,所以后面还要浪费3个字节,对齐8,所以最终的大小是8个字节 所以联合体也是存在内存空间的对齐的 */ //练习计算联合体大小 union...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样 使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。
,对结构体中的成员结构体,通过 {} 单独进行赋值 1.4 结构体的访问 针对于结构体的访问,也有如下两种方式: 方法一:通过 · 直接进行访问 #include struct...匿名结构体的成员可以被外层结构体 / 联合体 “直接访问”,无需通过结构体名称中转。 2.2 结构体的自引用 思考在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?...③char c2 变量本身大小为1个字节 与 vs默认对齐数8 的最小值为1 所以对齐数为1,再根据规则存放到对齐数的整数倍偏的 位置处。 ...因为结构体的总大小为成员变量中对齐数的整数倍,成员变量中最大的对齐数为4,故而总大小为12个字节。...//输出的结果是什么?
让我们一起进入更深层次的数据世界吧! 小小精灵球中蕴含的复杂类型 ---- 正文 在本篇文章中,我将会给大家介绍几种自定义类型:结构体、位段、枚举、联合体。...图片来源:百度百科 简言之,内存对齐就是使结构体中的数据在内存中的存储更有规律,方便读取数据。...注意: 1.一般情况下不要修改默认对齐数,避免破坏代码的可移植性 2.当结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。...由此可知,联合体中的成员变量共用一块内存空间,比如其中定义了一个字符型和一个整型,最终联合体的大小为4字节(一个整型大小),联合体中也有内存对齐,不过不像结构体那样严格,联合体在进行内存对齐时,会判断此时所占字节数是否为其中最大对齐数的倍数...2.联合体中也存在内存对齐,同样是只针对整个联合体的内存对齐,要使整个联合体所占字节数为最大成员对齐数的倍数。
,我么可以自己更改默认对齐数 宏offsetof 作用: 计算结构体中某变量相对于首地址的偏移,并给出说明 #include #include struct...原因: 函数传参的时候,参数是需要压栈的,压栈会占用空间 如果传递一个结构体对象的时候,结构体过大的话,那么参数压栈的的系统开销比较大,会导致性能下降 柔性数组 定义: C99 中,结构中的最后一个元素允许是未知大小的数组...,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员 使用: sizeof 返回的这种结构大小不包括柔性数组的内存 用malloc()函数进行内存动态分配,分配的内存应该大于结构的大小...(属于整形家族)类型 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段 示例: struct...) 当存入的数据大于相应的空间(冒号后的数字表示属于该变量的空间大小,单位为bite)可以表示的数据大小时,会发生截断(从右边开始) 对于一个字节里还剩的空间,如果后面的位段空间能够放入时,将存入这一个字节里还剩的空间里
引言: 前面我们已经讲了结构体的声明,自引用,内存对齐等,详细见《掌握C语言结构体,开启编程新世界》。有需要的可以回看。 今天我们讲的是枚举和结合体,这两个跟结构体很相像但也是还是有差别的。...我们知道了它们是用的用一块地址,具体是怎么样的我画图来给大家看看。 这是union在内存中的存储。 1.3 对齐数 虽然联合体的内存是是共⽤同⼀块内存空间的,但也是有最大对齐数的。...,用起来也很方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。...,C语言枚举提供了一种清晰、可读性强且具有类型安全性的常量定义方式,可以使代码更易于理解和维护。...在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐ 较严格。 结构体、联合体和枚举类型到这里就结束了,观众老爷们 ✨✨欢迎点赞☕️☕️收藏✍✍评论
前言 结构体与联合体都有多个成员,但是结构体每个成员都有自己独立空间,联合体所有成员共用一块内存空间 自定义类型:联合和枚举 1.联合体类型的声明 1.1 联合体类型的声明 像结构体⼀样,联合体也是由⼀...代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。...对齐数2 int i;//4 对齐数4 }; int main() { //下⾯输出的结果是什么?...,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。...在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐ 较严格。
结构体的定义和用途 首先我们需要知道,结构体是什么,为什么要用结构体? 在编程中,特别是在像C和C++这样的语言中,结构体(struct)是一种用于创建复合数据类型的工具。...结构体允许你将多个不同类型的数据项组合成一个单一的实体。这对于组织和管理数据非常有用,尤其是当你需要处理复杂的数据集时。...结构体的嵌套使用 结构体的嵌套使用是指在一个结构体中定义另一个结构体类型的成员。这是一种常见的方式,用来创建更加复杂的数据结构,能够表示对象的层次关系或组合属性。...在上面的例子中,如果 int 为4字节,float 为4字节,char 数组为20字节,那么 union Data 的大小将为20字节。...char 数组使用了5个字节,所以联合体的大小至少是5字节。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?...占8,函数指针占8个,由于是64位编译是8字节对齐(说明:按几字节对齐,是根据结构体的最长类型决定的,这里是函数指针是最长的字节,所以按8字节对齐)所以该结构体占24个字节。...不同平台内存对齐方式不同。如果使用结构体进行平台间的通信,会有问题。例如,发送消息的平台上,结构体为24字节,接受消息的平台上,此结构体为32字节(只是随便举个例子),那么每个变量对应的值就不对了。...不同框架的处理器对齐方式会有不同,这个时候不指定对齐的话,会产生错误结果 12、inline函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。...联合体占用内存是最大的那个,和结构体不一样。
今天我们更新了联合体和结构体的内容 一、结构体位段 我们先来说一下上一篇结构体博客中遗留下来的问题吧,叫做结构体位段问题,这个问题该咋去讲呢,就是结构体位段。...,我们说了他的作用是通过耗费更多的空间来获取更快的运行速度,然后这个结构体位段的作用是什么呢,它就是要耗费更少的内存空间。...char占一个字节,然后int占四个字节,按对齐的规则是不是占八个字节呢,我们运行一下看一下: 我们发现结果是4,这是为什么呢?...这里还有一个知识点,联合体的大小至少是最大成员的大小,当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。...,用起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样 使得结构体的⼤⼩就会偏⼤,比较浪费内存。
} 返回的指针指向的是堆区内存,而堆区内存不会随着函数的结束而销毁;也可以避免局部变量的生命周期问题 6)结构体内存对齐 内存对齐是指计算机内存中数据的存储方式,目的是优化内存访问速度。...特别是在 C 语言中,结构体内存对齐是一个至关重要的概念。结构体中每个成员变量会根据其数据类型的大小自动进行对齐,以便更高效地存储和访问数据。...尾部填充: 结构体总大小需为其最大成员对齐值的整数倍(此处为4), 因此在 c2 后填充3字节, 使总大小为12字节 有了上面的例子,我们再来讲解一下结构体对齐规则: 1....6 字节:c1(1) + i(4) + c2(1) #pragma pack() // 恢复默认对齐方式(通常是 4 或 8) int main() { // 输出结构体 S 的大小...平台兼容:不同硬件平台有不同的对齐要求 7)结构体实现位段 7.1)位段是什么?
(vs中默认的值为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小) 3.结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中的最大的)的整数倍 4.如果嵌套了结构体...,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍 struct s1 { char c1; int i; char...假设⼀个处理器总是从内存中取8个字节,则地 址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对⻬成8的倍数,那么就可以 ⽤⼀个内存操作来读或者写值了。...0; } 通过上面代码中的#pragma pack( 1 )就可以改变编译器的默认对齐数,将默认对齐数8改为1,#pragma pack()是取消设置的对齐数,还原为默认。...); } int main() { print1(s); //传结构体 print2(&s); //传地址 return 0; } 在上面两种结构体传参的方式中,推荐传址调用,这样可以减少空间的使用
【FFI字符串·传输】是FFI诸多概念中: 最简单的里最难的 — 对比·各种整数类 最难的里最简单的 — 对照·样式繁多的自定义数据结构 它算是难度适中,既能讲出点内容来,又不会知识点太过生涩劝退读者。...即,借助mut Vec + std::ptr::copy_nonoverlapping() --> CString --> String的组合“暴击”,将C内存上的C字符串逐字节地复制到Rust...于是,先libc::malloc(...)在C内存划出一段未初始化的字节数组;然后,将C字符串有效内容都给填过去;再,塞上尾字节\0;接着,把原始指针丢给C调用端程序;最后,Rust函数安全、合规地结束...即,借助libc::malloc() + std::ptr::copy_nonoverlapping() + std::ptr::write()组合,将Rust内存上的C字符串逐字节地复制到C内存。...结束语 其实,FFI传递复杂【自定义·数据结构】的底层原理与处理【字符串】非常相似。只不过,数据结构的编码方式变得更复杂了,没有C字符串与Rust字符器那么泾渭分明。
char c2占一个字节,对齐数为1. int i 占4个字节,vs环境下他的对齐数为4,所以他在地址中要从4的倍数开始储存。 此时结构体的总大小是8个字节,为最大对齐数4的倍数。...0; 这里设置默认对齐数为1,就相当于连续存放,结构体的大小为 1+4+1=6 结论: 结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。...d存放的可能方式 1.将第一个开辟的空间剩余的13个bit位占满后,在第二个空间中存放17个bit位。...第一个打印结果, char 类型的数组占5个字节,该联合体最大对齐数是4,所以要浪费3个字节的空间,占8个字节。 ...第二个打印结果, short类型的数组占14个字节,在联合体最大对齐数是4,所以要浪费2个字节的空间,占16个字节。 好的,关于自定义类型的详解就说到这里,谢谢大家的欣赏!!