一:struct和union的区别

struct,相互关联的元素的集合,每个元素都有自己的内存空间;每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序;一个struct所占的总的内存大小,并不是各个元素所占空间之和,而是存在字节对齐的问题

union,它所有的元素共享同一内存单元,且分配给 union 的内存空间由类型最大的元素 size 来确定

因此在使用union时容易犯的错误就是,给一个union的多个元素赋值;由于共享内存,最后的赋值会覆盖前面所有的值,实际上只对最后的元素赋值

二:struct字节对齐问题(gcc编译器)

每个元素相对于结构体的首地址的偏移量能被该元素的size整数;如果该元素size>4,则偏移量能被4整除即可

另外struct的总size并没有严格为4或8的倍数;不过这个问题还是跟编译器和平台有关,如果知道(也可以编译器设置)参数信息,要计算出来不难

测试代码:

#include

#include

usingnamespace std;

#define LL longlong

struct E1 {

int a;char b;char c;

}e1;

struct E2 {

char b;int a;char c;

}e2;

struct E3 {

char a;short b;int c; LL d;

}e3;

struct E4 {

int c; LL d;char a;short b;

}e4;

struct E5 {

char a1,a2,a3,a4,a5,a6;

}e5;

struct E6 {

char a1,a2,a3;

}e6;

struct E7 {

struct E5 elem5;

struct E6 elem6;

LL a;

}e7;

struct E8 {

char a[9];

}e8;

struct E9 {

struct E8 elem8;

LL a;

}e9;

struct E10 {

char a;

};

int main(){

puts("----> E1");

cout <

printf("%x %x %x %x\n",&e1,&e1.a,&e1.b,&e1.c);

puts("----> E2");

cout <

printf("%x %x %x %x\n",&e2,&e2.b,&e2.a,&e2.c);

puts("----> E3");

cout <

printf("%x %x %x %x %x\n",&e3,&e3.a,&e3.b,&e3.c,&e3.d);

puts("----> E4");

cout <

printf("%x %x %x %x %x\n",&e4,&e4.c,&e4.d,&e4.a,&e4.b);

puts("----> E5");

cout <

puts("----> E6");

cout <

puts("----> E7");

cout <

printf("%x %x %x %x\n",&e7,&e7.elem5,&e7.elem6,&e7.a);

puts("----> E8");

cout <

puts("----> E9");

cout <

printf("%x %x %x\n",&e9,&e9.elem8,&e9.a);

puts("----> E10");

cout <

return0;

}

输出:

E1

8

facd2140 facd2140 facd2144 facd2145

E2

12

facd2148 facd2148 facd214c facd2150

E3

16

facd2160 facd2160 facd2162 facd2164 facd2168

E4

24

facd2170 facd2170 facd2178 facd2180 facd2182

E5

6

E6

3

E7

24

facd21a0 facd21a0 facd21a6 facd21b0

E8

9

E9

24

E10

1

Linux+c语言结构体对齐,C语言中结构体struct的对齐问题解析相关推荐

  1. 整数边界对齐方式_c中结构体边界对齐(转)

    c中结构体边界对齐(转) 2011-11-23 11:15:52|  分类: C&C++ |  标签: |字号大中小 C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.结构体到底怎 ...

  2. c语言将结构体存储在数组中,结构体数组方法用法 _C语言-w3school教程

    C语言 的 结构体数组 在C语言编程中可以将一系列结构体来存储不同数据类型的许多信息. 结构体数组也称为结构的集合. 我们来看一个数组结构体的例子,存储5位学生的信息并打印出来.创建一个源文件:str ...

  3. C语言四川麻将算法,四川麻将中番种是如何计算的详细解析

    同城游中的四川麻将里都是有番数的,不过对新手玩家而言,计番是个头疼的问题,那么麻将中有都哪些番数呢?现在赶紧来看看四川麻将番种是如何计算的详细解析吧. 四川麻将中基础牌型(格)与基本番数 平胡:普通的 ...

  4. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  5. c语言实现结构体变量private,C语言中结构体变量私有化详解

    背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...

  6. 1、体脂手环、体脂秤等产品的体脂测量原理及技术方案分析

    一.体脂检测属于人体成分分析中的一项 在医疗仪器领域早已应用较多.由于最近两年穿戴式设备的爆发,传统医疗仪器上的部分检测功能被搬到了手环.手表.水杯或体重秤等普通消费类电子上.比较常见的有计步.卡里路 ...

  7. c# 结构体 4字节对齐_C语言程序员们常说的“内存对齐”,究竟有什么目的?

    在C语言程序开发中,有时有经验的程序员会提起"内存对齐"一词,事实上,这也是C语言中结构体的 size 不等于它所有成员 size 之和的原因(C语言中的结构体的size,并不等于 ...

  8. linux c 结构体参数,C语言结构体类型定义

    C语言结构体类型定义 结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种: 1.先定义结构体,再定义变量: eg. struct student{ cha ...

  9. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则

    要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...

最新文章

  1. 融入产业生态的靶向孵化
  2. 21、 TRUNCATE:清空表记录
  3. java xml 验证工具_验证xml格式
  4. Github上Fork部署应用程序
  5. mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...
  6. as3 crypto 加密解密des,rsa
  7. 由浅入深,解决三道【只出现一次的数】!
  8. VTN联合GWI共同启动“全球健康登月计划”让更多人享受到健康新生活
  9. 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗。
  10. idea 提示 TKK 更新TKK失败,请检查网络连接,解决办法!
  11. java消息中间件_java消息中间件
  12. LVS负载均衡群集合集
  13. win7 ftp安装搭建,并且上传图片到ftp文件夹下,使用nginx访问下载图片
  14. 操作演示 | 如何将示波器波形直接保存到PC端
  15. python爬取今日头条热点新闻事件,Python爬虫实战入门五:获取JS动态内容—爬取今日头条...
  16. [ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?
  17. synergy一个鼠标控制多个电脑,synergy怎么用?synergy配置教程
  18. html 选择自动增加行数,为网页中的源代码自动设置行号
  19. seq2seq文本翻译的例子
  20. 随机信号处理AR模型Yule_Walker方程直接解法和Levinson_Durbin递推法的MATLAB与Python实现

热门文章

  1. 从 JavaScript 属性描述器剖析 Vue.js 响应式视图
  2. nagios监控安装及设置案例
  3. 2010——满地遍是网页防篡改和WAF
  4. NOIP2018 游记
  5. 软件外包项目管理3点体会
  6. hibernate悲观锁,乐观锁
  7. PHP------继承、多态
  8. Data Pump failed with ORA-04031/ORA-4030?
  9. VMware 克隆多个centos 7 操作系统
  10. dplyr | 数据处理函数的功能速查!dplyr包中的十类操作函数汇总(下篇)