0
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心
发布
  • 发文章

  • 发资料

  • 发帖

  • 提问

  • 发视频

创作活动

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

c语言中的字节对齐

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-30 11:03 次阅读

在缺省情况下,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。

审核编辑:汤梓红

  • 嵌入式
    +关注

    关注

    4476

    文章

    15933

    浏览量

    273154
  • C语言
    +关注

    关注

    177

    文章

    6714

    浏览量

    117107
  • 编译器
    +关注

    关注

    1

    文章

    1243

    浏览量

    48043
  • 编译
    +关注

    关注

    0

    文章

    381

    浏览量

    31339
  • 字节对齐
    +关注

    关注

    0

    文章

    5

    浏览量

    1456
收藏 人收藏

    评论

    相关推荐

    嵌入式软件工程师面试必备技能

    ,比如:C语言中字节对齐问题,一些常见的排序问题,进程线程相关问题,CC++的区别是什么,java的体系结构是什么,linux内核是如何制作的,在字符设备驱动中重要的一个数据结构是什么等等问题,这里
    发表于 10-26 14:55

    34 C语言字节对齐

    C语言编程语言
    车同轨,书同文,行同伦
    发布于 :2022年08月11日 05:06:13

    单片机c语言中定义字节怎么定义

    定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
    发表于 02-23 14:50

    C语言中怎么判断数组元素的个数

    C语言中怎么判断数组元素的个数,如数组:int array[]={45,56,76,234,1,34,23,2,3};
    发表于 05-26 11:49

    请问 C语言中怎么加上汇编

    请问 C语言中怎么加上汇编PCB打样找华强 http://www.hqpcb.com 样板2天出货
    发表于 12-18 14:11

    在学习c语言中...{:28:}

    在学习c语言中...{:28:}
    发表于 07-31 14:19

    51单片机c语言

    我想问一下,有符号整形(int)在c语言中是4个字节的,在单片机c语言中我试了一下,好像是2个字节的,求解读啊
    发表于 12-27 10:51

    c语言中通过加速度求位移怎么实现

    c语言中通过加速度求位移怎么实现在公路安全防护中,由于斜坡上会有石头等物品滚落,故需要增加防护网。 可是防护网受到撞击后,会产生位移,那么问题来了:c语言中通过加速度求位移怎么实现
    发表于 07-21 17:22

    嵌入式软件开发的学习经验分享及面试感悟,超有用

    ,归根到底还是没有学扎实,比如:C语言中字节对齐问题,一些常见的排序问题,进程线程相关问题,CC++的区别是什么,java的体系结构是什么,linux内核是如何制作的,在字符设备驱动中最重要的一个数
    发表于 02-16 15:49

    labview中有类似于c语言中的宏定义吗

    如题,labview中有类似于c语言中的宏定义吗 define xxx XXX。。。多谢~
    发表于 10-05 15:04

    C 语言中的保留字 总结C 语言中的保留字 总结C 语言中的保留字 总结C 语言中

    C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结C语言中的保留字 总结
    发表于 11-09 04:54

    C语言-结构体对齐详解

    `C语言-结构体对齐详解朱有鹏1、结构体为何要对齐访问访问结构体元素时需要对齐访问,主要是为了配合硬件,也就是说硬件本身有物理上的限制,因为对齐排布和访问可以提高访问效率。如:struct s
    发表于 07-12 16:41

    请问C语言中ASCII代码是什么意思?

    C语言中ASCII代码是什么意思常见的ASCII代码都需要记吗
    发表于 04-28 07:35

    为什么MMU实验不是4字节对齐

    是4B的一级描述符,图上写错了,抱歉这个是韦老师MMU实验的C语言源码,可以正常使用,但是问题来了,4B的描述符地址的[1:0]位应该是00啊,也就是4字节对齐啊,可是这里明显不是4字节对齐,而是1
    发表于 08-05 03:26

    请问.C语言中可以嵌套汇编语言吗?

    .C语言中可以嵌套汇编语言
    发表于 09-20 05:55

    请问C语言中可以嵌套汇编语言吗?

    C语言中可以嵌套汇编语言
    发表于 09-25 05:55

    请问C语言中能高效方式跟换字节位置吗?

    C语言中有没有一种高效方式跟换字节中的BIT位置,如:76543210更换成自己想要的规格如:45670123或者46570213等等。
    发表于 03-06 04:35

    C语言中的坑有哪些?

    总结几个C语言中的“坑”
    发表于 12-28 06:11

    不定参数在C语言中有哪些应用实例?

    请问不定参数在C语言中有哪些应用实例?
    发表于 04-27 06:15

    c语言中常用的宏定义有哪些?

    c语言中常用的宏定义有哪些?
    发表于 04-28 06:01

    c语言中double与float的区别 相关资料分享

    c语言中double与float的区别C语言中小数的数据类型为 float 或 double:float 称为单精度浮点数,double 称为双精度浮点数。不像整数,小数的长度始终是固定
    发表于 07-01 09:10

    C语言中atoi()函数的用法 相关资料分享

    C语言中atoi()函数的用法
    发表于 07-01 08:12

    C语言中断言如何去使用

    文章目录1 C语言中断言的使用1.1 处理方式1.2 原型定义1.3 示例代码1 C语言中断言的使用1.1 处理方式如果断言的条件返回错误,则终止程序执行。1.2 原型定义#includevoid
    发表于 07-14 08:15

    C语言中什么是goto语句

    什么是goto语句goto语句被称为C语言中的跳转语句,用于无条件跳转到其他标签,它将控制权转移到程序的其他部分。goto语句一般很少使用,因为它使程序的可读性和复杂性变...
    发表于 07-14 08:17

    c语言中整数的取值范围是多少

    c语言中整数的取值范围,文章目录1、整数的取值范围2、版权声明整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。在
    发表于 07-20 07:50

    c语言中double与float区别是什么?

    c语言中double与float区别是什么?
    发表于 10-14 07:58

    C语言中atoi()函数应该怎么用?

    C语言中atoi()函数应该怎么用?
    发表于 10-14 09:10

    C语言中断言是怎样使用的?

    C语言中断言是怎样使用的?
    发表于 10-14 07:18

    c语言中标志位有什么作用?

    c语言中标志位有什么作用?
    发表于 10-14 08:05

    如何使用单片机的C语言中的数组?

    如何使用单片机的C语言中的数组?
    发表于 10-15 08:59

    C语言中双下划线的作用是什么?

    C语言中双下划线的作用是什么?
    发表于 10-19 06:18

    请问在C语言中如何使用bool类型?

    C语言中如何使用bool类型?
    发表于 10-22 07:20

    C语言中三目运算符? :怎么使用?

    C语言中三目运算符? :怎么使用?
    发表于 11-02 09:23

    整型数据在C语言中的分类

    整型数据在C语言中,数据包含整型和浮点型两种数据,而浮点型又可以转换为二进制,最终所有数据都会变成二进制。补充:(不考虑有无符号)整型数据:int,short,long,long long,char,bool。浮
    发表于 11-08 07:36

    解决单片机开发字节对齐问题的方法

    单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C
    发表于 11-22 06:06

    STM32终极字节对齐的相关资料推荐

    一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节对齐。uint16_t定义变量地址要2字节对齐。uint32_t定义变量地址要4
    发表于 12-06 06:03

    如何解决嵌入式C语言中CAN报文字节序问题

    本文转载在我的微信公众号:古德曼汽车工业。希望关注本专栏的朋友,也能一并关注微信公众号。原文地址:嵌入式C语言中CAN报文字节序问题的处理方法友情提示:本期内容讨论的内容有烧脑,请大家做好
    发表于 12-15 07:55

    C语言中的宏是什么

    第五章 性能优化5.1 使用宏定义  在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。  写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个:  错误做法:#define MIN(A,B)  ( A
    发表于 12-15 08:20

    能不能在C语言中像操作寄存器那样直接操作一个字节的单独一位呢

       在C语言中通常操作只有真假两种状态的的数据时使用布尔bool变量比较多,如果需要同时观察多个状态,这时候选择位操作效率会更高,用一个字节的8位分别表示8种状态。比较节省内存,处理起来效率更高
    发表于 02-25 06:13

    C语言中的指针与数组分别有哪些作用呢

    C语言中的指针与数组分别有哪些作用呢?
    发表于 02-25 07:20

    C语言中的指针是什么?如何规避野指针

    C语言中的指针是什么?有哪几种类型?指针有何作用?如何规避野指针?
    发表于 02-25 06:47

    C语言中常见的数据溢出情况有哪些

    C语言中有几种基本数据类型呢?C语言中常见的数据溢出情况有哪些?
    发表于 02-25 07:55

    掌握在单片机下使用C语言编程内存对齐的知识点

    一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先
    发表于 02-28 07:47

    C语言中指针的介绍非常详细

    C语言中指针的介绍非常详细 C语言中指针的介绍非常详细
    发表于 12-25 10:39 57次下载

    C语言和汇编语言混合编程方法和C语言中断处理方法

    C语言和汇编语言混合编程方法和C语言中断处理方法,new
    发表于 01-06 14:36 27次下载

    基于ARM程序的字节对齐的分析

    任意值。如果一个数据是以能被4 整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。举例说明四字节对齐: 对内存进行操作时,被访问的地址必须为4的倍数。如果分配到的地址的地址不是4的倍数时,CPU实际访问的地址还是按照字对齐的方式
    发表于 09-19 16:04 0次下载

    C语言中的关键字

    C语言中的入门教程
    发表于 10-14 16:24 1次下载

    C语言教程之C语言中级培训教程—预处理电子课件免费下载

    本文档的主要内容详细介绍的是C语言教程之C语言中级培训教程—预处理电子课件免费下载
    发表于 09-04 17:11 11次下载
    <b>C</b><b>语言</b>教程之<b>C</b><b>语言中</b>级培训教程—预处理电子课件免费下载

    C51单片机C语言与标准C语言有什么区别?

    一:C51(单片机C语言)与标准C语言的区别1、 C51语言中定义的库函数与标准c语言中定义的库函数不同。2、 C51语言中的数据类型和标准c语言中的数据类型有一定的区别。3、
    发表于 10-09 08:00 129次下载
    <b>C</b>51单片机<b>C</b><b>语言</b>与标准<b>C</b><b>语言</b>有什么区别?

    单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明

    单片机C语言中如何使用nop函数进行短延时的效果资料和程序说明 标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。
    发表于 03-05 11:01 10次下载
    单片机<b>C</b><b>语言中</b>如何使用nop函数进行短延时的效果资料和程序说明

    EE-88:使用21xx编译器初始化C语言中的变量

    EE-88:使用21xx编译器初始化C语言中的变量
    发表于 05-19 21:08 1次下载
    EE-88:使用21xx编译器初始化<b>C</b><b>语言中</b>的变量

    单片机开发重点-字节对齐问题

    单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C
    发表于 11-13 13:06 6次下载
    单片机开发重点-<b>字节</b><b>对齐</b>问题

    STM32 终极字节对齐解析

    一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节对齐。uint16_t定义变量地址要2字节对齐。uint32_t定义变量地址要4
    发表于 11-23 18:06 11次下载
    STM32 终极<b>字节</b><b>对齐</b>解析

    单片机字节对齐

    对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种
    发表于 12-01 15:21 11次下载
    单片机<b>字节</b><b>对齐</b>

    C语言中的指针(重点)超详细

    C语言中的指针1、指针是什么2、指针和指针类型2.1、指针 + - 整数2.2、指针的解引用3、野指针3.1、野指针成因3.2、如何规避野指针4、指针运算4.1、指针 + - 整数4.2、指针
    发表于 01-13 14:10 11次下载
    <b>C</b><b>语言中</b>的指针(重点)超详细

    C语言 | 内存对齐01 - 什么是内存对齐

    一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先
    发表于 01-13 15:18 0次下载
    <b>C</b><b>语言</b> | 内存<b>对齐</b>01 - 什么是内存<b>对齐</b>

    详解C语言字节对齐

      一、什么是对齐,以及为什么要对齐:   1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是
    发表于 08-29 10:11 1052次阅读

    c语言中typedef的用法

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。
    发表于 11-09 15:23 7435次阅读

    C语言中随机数的生成代码

    C语言中随机数的生成完整代码:
    的头像 发表于 02-20 09:21 8163次阅读

    嵌入式C语言中如何判断数据是否损坏

    C语言中的结构体是非常有用的复合数据类型,正是有了结构体,C语言在描述复杂问题时才能够得心应手。
    发表于 08-19 11:46 552次阅读
    嵌入式<b>C</b><b>语言中</b>如何判断数据是否损坏

    C语言中的goto语句怎么用?为什么反对使用

    关于C语言的goto语句存在很多争议,很多书籍都建议“谨慎使用,或者根本不用”。这里先不做过多的讨论,存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用。先看一些goto如何用:
    的头像 发表于 01-24 17:38 4778次阅读
    <b>C</b><b>语言中</b>的goto语句怎么用?为什么反对使用

    总结那么几个C语言中的“坑”

    总结几个C语言中的“坑”
    的头像 发表于 01-16 10:52 2000次阅读

    解析C语言结构体字节如何对齐

    01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在
    的头像 发表于 06-12 17:42 2062次阅读

    C语言中Linux字节对齐的问题

    ,于是经过排查,是因为传递消息的结构体没有考虑字节对齐的问题。 随手整理一下C语言中字节对齐的问题与大家一起分享。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设
    的头像 发表于 08-16 11:25 1797次阅读
    <b>C</b><b>语言中</b>Linux<b>字节</b><b>对齐</b>的问题

    关于C语言结构体内存对齐

    今天给大家带来一道经典、易错的关于C语言结构体内存对齐的题目:
    的头像 发表于 04-14 12:51 6280次阅读

    C语言进阶】面试题:请使用宏定义实现字节对齐

    C语言进阶】面试题:请使用宏定义实现字节对齐
    的头像 发表于 07-11 09:21 1863次阅读
    【<b>C</b><b>语言</b>进阶】面试题:请使用宏定义实现<b>字节</b><b>对齐</b>

    C语言中指针的定义

    上一节中,我们利用了一个小知识来介绍了一下指针,在上面这个例子中,小明和小丽手中的这个杯子就好比我们C语言中的变量,它确实是实实在在存放一些有具体意义的数据。这个杯套就类似于C语言中指针的作用,假设
    发表于 08-15 16:24 1269次阅读
    <b>C</b><b>语言中</b>指针的定义

    c#语言中怎么使用HTTP代理

    c#语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:46 1146次阅读

    C语言进阶】如何正确使用C语言中的#if和enum枚举定义?

    C语言进阶】如何正确使用C语言中的#if和enum枚举定义?
    的头像 发表于 09-30 15:55 2156次阅读

    C语言进阶】字节数组的另一种写法

    本文给你介绍一种C语言中字节数组的写法,也许你还没见过?
    的头像 发表于 10-03 17:32 1737次阅读
    【<b>C</b><b>语言</b>进阶】<b>字节</b>数组的另一种写法

    c语言中的#号知识点分享

    c语言中的#号确实用得挺多的,比如说最开始编程的时候,大家最喜欢的#include…,确实有了这个东西我们就可以调用了我们想调用的东西了,心里必定欢喜!
    的头像 发表于 11-15 14:52 1487次阅读

    C语言中void指针的基本认识及典型应用

    C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不同。
    发表于 02-01 09:26 148次阅读

    C语言中的数组空间动态开辟

    C语言中的数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟数组空间,可以使用 malloc 函数,在C++中可以使用 new 关键字进行空间的动态开辟与回收,动态开辟空间
    的头像 发表于 02-10 12:42 278次阅读

    C语言中必须要掌握的位运算操作

    C语言中,特别是在嵌入式的开发中,位操作是很常用的一个知识点,涉及到按位(bit)操作的地方也是很常见的。本文分享一些C语言中的位操作运算的基础内容。
    的头像 发表于 02-10 14:19 219次阅读
    <b>C</b><b>语言中</b>必须要掌握的位运算操作

    C语言中数组在内存中如何表示

    C语言中数组在内存中是怎样表示的,今天就给大家聊聊这个话题。
    的头像 发表于 02-15 14:35 123次阅读
    <b>C</b><b>语言中</b>数组在内存中如何表示

    C语言中什么是关系运算符

    C语言中,比较符称为关系运算符,所谓关系运算就是比较运算,将两个数值进行比较,判断其比较的结果是否符合给的的条件。
    的头像 发表于 03-09 10:47 288次阅读

    C语言中什么是指针数组

    C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。
    的头像 发表于 03-10 15:26 123次阅读

    简述C语言中指针重点

    C语言中一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型。
    的头像 发表于 03-10 15:28 95次阅读

    嵌入式C语言中堆和栈的区别

    在嵌入式C语言中,堆和栈都是用来存储变量的内存区域,但它们在存储和使用变量方面有很大的区别。
    的头像 发表于 04-14 11:45 158次阅读

    C/C++编译器的缺省字节对齐方式

    C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。
    的头像 发表于 04-15 11:24 112次阅读

    下载硬声App