在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。
在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。
C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。
C编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍,则在最后一个成员后填充空字节。
struct Test
{
char x1; // 成员x1为char型(其起始地址必须1字节对界),其偏移地址为0
char x2; // 成员x2为char型(其起始地址必须1字节对界,其偏移地址为1
float x3; // 成员x3为float型(其起始地址必须4字节对界),编译器在x2和x3之间填充了两个空字节,其偏移地址为4
char x4; // 成员x4为char型(其起始地址必须1字节对界),其偏移地址为8
};
因为Test结构体中,最大的成员为flaot x3,因些此结构体的自然对界条件为4字节对齐。则结构体长度就为12字节,内存布局为1100 1111 1000。
#include //#pragma pack(2)typedef struct
{
int aa1; //4个字节对齐 1111 char bb1;//1个字节对齐 1 short cc1;//2个字节对齐 011 char dd1; //1个字节对齐 1 } testlength1;
int length1 = sizeof(testlength1); //4个字节对齐,占用字节1111 1011 1000,length = 12
typedef struct
{
char bb2;//1个字节对齐 1 int aa2; //4个字节对齐 01111 short cc2;//2个字节对齐 11 char dd2; //1个字节对齐 1 } testlength2;
int length2 = sizeof(testlength2); //4个字节对齐,占用字节1011 1111 1000,length = 12
typedef struct
{
char bb3; //1个字节对齐 1 char dd3; //1个字节对齐 1 int aa3; //4个字节对齐 001111 short cc23//2个字节对齐 11
} testlength3;
int length3 = sizeof(testlength3); //4个字节对齐,占用字节1100 1111 1100,length = 12
typedef struct
{
char bb4; //1个字节对齐 1 char dd4; //1个字节对齐 1 short cc4;//2个字节对齐 11 int aa4; //4个字节对齐 1111 } testlength4;
int length4 = sizeof(testlength4); //4个字节对齐,占用字节1111 1111,length = 8int main(void)
{
printf("length1 = %d.n",length1);
printf("length2 = %d.n",length2);
printf("length3 = %d.n",length3);
printf("length4 = %d.n",length4);
return 0;
}
对齐规则为:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
因此,当使用伪指令#pragma pack (2)时,Test结构体的大小为8,内存布局为11 11 11 10。
审核编辑:汤梓红
相关推荐
,比如:C语言中字节对齐问题,一些常见的排序问题,进程线程相关问题,C或C++的区别是什么,java的体系结构是什么,linux内核是如何制作的,在字符设备驱动中重要的一个数据结构是什么等等问题,这里
发表于 10-26 14:55
C语言编程语言
车同轨,书同文,行同伦
发布于 :2022年08月11日 05:06:13
定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
发表于 02-23 14:50
C语言中怎么判断数组元素的个数,如数组:int array[]={45,56,76,234,1,34,23,2,3};
发表于 05-26 11:49
请问 C语言中怎么加上汇编PCB打样找华强 http://www.hqpcb.com 样板2天出货
发表于 12-18 14:11
在学习c语言中...{:28:}
发表于 07-31 14:19
我想问一下,有符号整形(int)在c语言中是4个字节的,在单片机c语言中我试了一下,好像是2个字节的,求解读啊
发表于 12-27 10:51
c语言中通过加速度求位移怎么实现在公路安全防护中,由于斜坡上会有石头等物品滚落,故需要增加防护网。 可是防护网受到撞击后,会产生位移,那么问题来了:c语言中通过加速度求位移怎么实现
发表于 07-21 17:22
,归根到底还是没有学扎实,比如:C语言中字节对齐问题,一些常见的排序问题,进程线程相关问题,C或C++的区别是什么,java的体系结构是什么,linux内核是如何制作的,在字符设备驱动中最重要的一个数
发表于 02-16 15:49
如题,labview中有类似于c语言中的宏定义吗 define xxx XXX。。。多谢~
发表于 10-05 15:04
C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结
发表于 11-09 04:54
`C语言-结构体对齐详解朱有鹏1、结构体为何要对齐访问访问结构体元素时需要对齐访问,主要是为了配合硬件,也就是说硬件本身有物理上的限制,因为对齐排布和访问可以提高访问效率。如:struct s
发表于 07-12 16:41
C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
发表于 04-28 07:35
是4B的一级描述符,图上写错了,抱歉这个是韦老师MMU实验的C语言源码,可以正常使用,但是问题来了,4B的描述符地址的[1:0]位应该是00啊,也就是4字节对齐啊,可是这里明显不是4字节对齐,而是1
发表于 08-05 03:26
.C语言中可以嵌套汇编语言?
发表于 09-20 05:55
C语言中可以嵌套汇编语言?
发表于 09-25 05:55
C语言中有没有一种高效方式跟换字节中的BIT位置,如:76543210更换成自己想要的规格如:45670123或者46570213等等。
发表于 03-06 04:35
总结几个C语言中的“坑”
发表于 12-28 06:11
请问不定参数在C语言中有哪些应用实例?
发表于 04-27 06:15
c语言中常用的宏定义有哪些?
发表于 04-28 06:01
c语言中double与float的区别C语言中小数的数据类型为 float 或 double:float 称为单精度浮点数,double 称为双精度浮点数。不像整数,小数的长度始终是固定
发表于 07-01 09:10
C语言中atoi()函数的用法
发表于 07-01 08:12
文章目录1 C语言中断言的使用1.1 处理方式1.2 原型定义1.3 示例代码1 C语言中断言的使用1.1 处理方式如果断言的条件返回错误,则终止程序执行。1.2 原型定义#includevoid
发表于 07-14 08:15
什么是goto语句goto语句被称为C语言中的跳转语句,用于无条件跳转到其他标签,它将控制权转移到程序的其他部分。goto语句一般很少使用,因为它使程序的可读性和复杂性变...
发表于 07-14 08:17
c语言中整数的取值范围,文章目录1、整数的取值范围2、版权声明整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。在
发表于 07-20 07:50
c语言中double与float区别是什么?
发表于 10-14 07:58
C语言中atoi()函数应该怎么用?
发表于 10-14 09:10
C语言中断言是怎样使用的?
发表于 10-14 07:18
c语言中标志位有什么作用?
发表于 10-14 08:05
如何使用单片机的C语言中的数组?
发表于 10-15 08:59
C语言中双下划线的作用是什么?
发表于 10-19 06:18
在C语言中如何使用bool类型?
发表于 10-22 07:20
C语言中三目运算符? :怎么使用?
发表于 11-02 09:23
整型数据在C语言中,数据包含整型和浮点型两种数据,而浮点型又可以转换为二进制,最终所有数据都会变成二进制。补充:(不考虑有无符号)整型数据:int,short,long,long long,char,bool。浮
发表于 11-08 07:36
单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C
发表于 11-22 06:06
一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节对齐。uint16_t定义变量地址要2字节对齐。uint32_t定义变量地址要4
发表于 12-06 06:03
本文转载在我的微信公众号:古德曼汽车工业。希望关注本专栏的朋友,也能一并关注微信公众号。原文地址:嵌入式C语言中CAN报文字节序问题的处理方法友情提示:本期内容讨论的内容有烧脑,请大家做好
发表于 12-15 07:55
第五章 性能优化5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法:#define MIN(A,B) ( A
发表于 12-15 08:20
在C语言中通常操作只有真假两种状态的的数据时使用布尔bool变量比较多,如果需要同时观察多个状态,这时候选择位操作效率会更高,用一个字节的8位分别表示8种状态。比较节省内存,处理起来效率更高
发表于 02-25 06:13
C语言中的指针与数组分别有哪些作用呢?
发表于 02-25 07:20
C语言中的指针是什么?有哪几种类型?指针有何作用?如何规避野指针?
发表于 02-25 06:47
C语言中有几种基本数据类型呢?C语言中常见的数据溢出情况有哪些?
发表于 02-25 07:55
一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先
发表于 02-28 07:47
C语言中指针的介绍非常详细 C语言中指针的介绍非常详细
发表于 12-25 10:39
•57次下载
C语言和汇编语言混合编程方法和C语言中断处理方法,new
发表于 01-06 14:36
•27次下载
任意值。如果一个数据是以能被4 整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。举例说明四字节对齐: 对内存进行操作时,被访问的地址必须为4的倍数。如果分配到的地址的地址不是4的倍数时,CPU实际访问的地址还是按照字对齐的方式
发表于 09-19 16:04
•0次下载
C语言中的入门教程
发表于 10-14 16:24
•1次下载
本文档的主要内容详细介绍的是C语言教程之C语言中级培训教程—预处理电子课件免费下载
发表于 09-04 17:11
•11次下载
一:C51(单片机C语言)与标准C语言的区别1、 C51语言中定义的库函数与标准c语言中定义的库函数不同。2、 C51语言中的数据类型和标准c语言中的数据类型有一定的区别。3、
发表于 10-09 08:00
•129次下载
单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
发表于 03-05 11:01
•10次下载
EE-88:使用21xx编译器初始化C语言中的变量
发表于 05-19 21:08
•1次下载
单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C
发表于 11-13 13:06
•6次下载
一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节对齐。uint16_t定义变量地址要2字节对齐。uint32_t定义变量地址要4
发表于 11-23 18:06
•11次下载
对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种
发表于 12-01 15:21
•11次下载
C语言中的指针1、指针是什么2、指针和指针类型2.1、指针 + - 整数2.2、指针的解引用3、野指针3.1、野指针成因3.2、如何规避野指针4、指针运算4.1、指针 + - 整数4.2、指针
发表于 01-13 14:10
•11次下载
一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先
发表于 01-13 15:18
•0次下载
一、什么是对齐,以及为什么要对齐:
1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是
发表于 08-29 10:11
•1052次阅读
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。
发表于 11-09 15:23
•7435次阅读
C语言中随机数的生成完整代码:
发表于 02-20 09:21
•8163次阅读
C语言中的结构体是非常有用的复合数据类型,正是有了结构体,C语言在描述复杂问题时才能够得心应手。
发表于 08-19 11:46
•552次阅读
关于C语言的goto语句存在很多争议,很多书籍都建议“谨慎使用,或者根本不用”。这里先不做过多的讨论,存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用。先看一些goto如何用:
发表于 01-24 17:38
•4778次阅读
总结几个C语言中的“坑”
发表于 01-16 10:52
•2000次阅读
01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在
发表于 06-12 17:42
•2062次阅读
,于是经过排查,是因为传递消息的结构体没有考虑字节对齐的问题。 随手整理一下C语言中字节对齐的问题与大家一起分享。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设
发表于 08-16 11:25
•1797次阅读
今天给大家带来一道经典、易错的关于C语言结构体内存对齐的题目:
发表于 04-14 12:51
•6280次阅读
【C语言进阶】面试题:请使用宏定义实现字节对齐
发表于 07-11 09:21
•1863次阅读
上一节中,我们利用了一个小知识来介绍了一下指针,在上面这个例子中,小明和小丽手中的这个杯子就好比我们C语言中的变量,它确实是实实在在存放一些有具体意义的数据。这个杯套就类似于C语言中指针的作用,假设
发表于 08-15 16:24
•1269次阅读
c#语言中怎么使用HTTP代理。
发表于 09-01 14:46
•1146次阅读
【C语言进阶】如何正确使用C语言中的#if和enum枚举定义?
发表于 09-30 15:55
•2156次阅读
本文给你介绍一种C语言中字节数组的写法,也许你还没见过?
发表于 10-03 17:32
•1737次阅读
c语言中的#号确实用得挺多的,比如说最开始编程的时候,大家最喜欢的#include…,确实有了这个东西我们就可以调用了我们想调用的东西了,心里必定欢喜!
发表于 11-15 14:52
•1487次阅读
C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不同。
发表于 02-01 09:26
•148次阅读
C语言中的数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟数组空间,可以使用 malloc 函数,在C++中可以使用 new 关键字进行空间的动态开辟与回收,动态开辟空间
发表于 02-10 12:42
•278次阅读
C语言中,特别是在嵌入式的开发中,位操作是很常用的一个知识点,涉及到按位(bit)操作的地方也是很常见的。本文分享一些C语言中的位操作运算的基础内容。
发表于 02-10 14:19
•219次阅读
C语言中数组在内存中是怎样表示的,今天就给大家聊聊这个话题。
发表于 02-15 14:35
•123次阅读
在C语言中,比较符称为关系运算符,所谓关系运算就是比较运算,将两个数值进行比较,判断其比较的结果是否符合给的的条件。
发表于 03-09 10:47
•288次阅读
在C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
发表于 03-10 15:26
•123次阅读
在C语言中一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型。
发表于 03-10 15:28
•95次阅读
在嵌入式C语言中,堆和栈都是用来存储变量的内存区域,但它们在存储和使用变量方面有很大的区别。
发表于 04-14 11:45
•158次阅读
C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。
发表于 04-15 11:24
•112次阅读
评论