C语言中的数据对齐问题

数据对齐:现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

以下面的代码为例:

#include<stdio.h> typedef struct {char a;short b;int c;
}test;int main(){test t;t.a='a';t.b=0x12;t.c=0x34;printf("test结构体的长度:%ld\n",sizeof(test));char*p=(char*)&t;for(int i=0;i<sizeof(test);i++,p++){printf("%02x ",*p);}printf("\n");printf("成员a起始地址:0x%p\n成员b起始地址:0x%p\n成员c起始地址:0x%p\n",&t.a,&t.b,&t.c);return 0;
}

代码效果:
和一般认为的7字节长度不同,test结构体实际的长度位为8字节。可以从代码结果中看出成员a和成员b之间多了一个保留字节,因此导致了结构体长度变为了8。结构体在编译过程中发生了数据对齐。

对齐方式
数据对齐的方式如下:
1、结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
2、在经过上述分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。

举个例子:

struct new{
int a;
char b;
int c;
};

由上述易推知结构体new的长度为12个字节。

如果想要编译过程中取消数据对齐,有如下方式:
1、加入预编译选项#pragma pack(n)
n=1时,表示全紧凑,此时struct中不会多出保留字节。
2、linux中gcc选项 “-fpack-struct”
3、linux中使用__attributte__((packed))声明。示例:

struct new{
int a;
char b;
int c;
}_attribute_((packed))

因此在C语言编程中需要小心对结构体使用memcpy()等内存函数,地址不小心就会弄错!

C语言中的struct结构体对齐问题相关推荐

  1. c语言中fread读取结构体,fread读取结构体注意事项

    作者 : 卿笃军 函数原型 size_t fread ( void * buffer , size_t size , size_t count , FILE * stream ) ; 参 数 buff ...

  2. C语言中的FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  3. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  4. c语言struct结构体类型有关typedef定义的本名和别名

    c语言结构体类型的本名 首先,定义结构体的标准语法为 在c语言中,定义结构体的标准语法是: struct A {}; A是这个结构体的[**本名**].在使用本名定义一个新的结构体时, 必须加上str ...

  5. go中Struct 结构体详解

    目录 一.结构体定义 1.结构体的定义 2.结构体字段的可见性 3.结构体的匿名字段 二.结构体实例化 1.基本实例化 2.针类型实例化 3.取地址实例化 三.结构体初始化 1.两种初始化的方式 2. ...

  6. 结构体(对齐规则及举例)

    结构体(对齐规则及举例) 文章目录 结构体(对齐规则及举例) 概念 结构体声明 结构体对齐规则 对齐原因 对齐规则 举例说明对齐原则 C++中的结构体struct------类 class和struc ...

  7. Go语言核心之美 3.4-Struct结构体

    struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...

  8. C语言中的struct用法

    参考自C语言中的struct用法 在c语言中结构体(struct)跟面向对象编程(如java等)里面的类是非常相似的.不过像C++里面对结构体进行了扩展,c++里面的结构体是可以包含方法的,但是C语言 ...

  9. C语言之结构体以及结构体对齐访问

    1:简单理解,结构体就是数组的进一步发展,数据的优点和缺陷在于数据里面是元素类型必须相同,但是结构体没有这个要求,结构体里面元素的类型可以相同也可以不同. 2:结构体的定义: struct stude ...

最新文章

  1. 属于我们的纪念日-相识一周年 - 生活至上,美容至尚!
  2. EF架构~为分组添加位运算聚合方法
  3. 079_html5内联SVG
  4. 南京秦淮灯会亮灯迎春 明城墙内外“飘”年味
  5. frame,iframe,frameset 的区别
  6. UESTC 电子科大专题训练 DP-N
  7. python命令行模式和交互模式区别_对命令行模式与python交互模式介绍
  8. 关联规则java apriori_关联规则算法(The Apriori algorithm)详解
  9. php insert方法,lInsert 命令/方法/函数
  10. 周年直播倒计时2天,攒足惊喜等你开场! | MindSpore 开源一周年
  11. axure树形表格_Axure教程:可增删改的树型结构
  12. Apache Storm技术实战之2 -- BasicDRPCTopology
  13. 智慧城管统计考评详解
  14. 在bug的边缘疯狂试探之mybatis
  15. 关于色光三原色与颜料三原色
  16. css动画放大缩小效果
  17. 利用pandoc把latex文件转换为word的基本操作
  18. Python 可视化 | 关联图 - 散点图1
  19. 读完这篇,让你真正理解Redis持久化
  20. 网络高手必备十款经典软件

热门文章

  1. 线段树——HDU - 1698
  2. 25个增强iOS应用程序性能的提示和技巧 — 中级篇
  3. 中国互联网+光通信器件行业商业模式创新与投资机会深度研究报告
  4. django基础(一)
  5. OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)
  6. 树形结构在关系数据库中的设计
  7. 基于设计模式的学习之旅-----访问者模式(附源码)
  8. 一则android软件开发工程师的招聘信息
  9. JAVA基础(JAVA 执行环境) 第一天
  10. java arcengine_在Java程序中调用ArcEngine