linux结构体大小端,剖析结构体和大小端

结构体

1.概念

1.结构体:描述一个事物,问题的一系列数据的集合.

例:linux

struct person

{

char name[20];

int year;

int class;

int phone;

char addr;

};web

2.做用

1.内置类型没法描述须要表述的事物,问题时就会定义结构体

2.返回的参数不仅是一个而是一个集合时就会采用结构体svg

3.内存对齐问题

(如下问题都是在32位平台讨论)

产生内存对齐的问题的缘由

1.不是全部的硬件平台都只支持访问任意地址上的任意数据

2.内存对齐能够提升工做效率,对于没有对齐的数据,内存访问的时候可能会处理两次而对齐的数据能够只访问一次

内存对齐就是典型的以空间换时间的作法

内存对齐规则

1.第一个成员与结构体变量的偏移量为0的地址处

2.剩余的变量要对齐到某个(对齐数)的整数倍的位置上

对齐数为编译器默认的一个对齐数与该成员大小的较小值。

VS中默认的值为8

linux中默认的值为4

3.结构体总大小为最大对齐数(第一个成员变量没有对齐数)的整数倍

4.若是结构体中有成员变量的类型是结构体被,镶嵌的结构体对齐到本身的最大对齐数的整数倍处,结构体总大小为最大对齐数的整数倍(遵循第3条原则:这里的最大对齐数包括被嵌套结构体的对齐数)3d

例:

struct student

{

char a;

double c;

int b;

}

e2dd35b01c568bf8e9e851d73826157a.png

struct person

{

char p;

student s;

int q;

}

9a71f8d4bc76d1c0b13c6cc8b707a28e.pngcode

大小端

1.背景

在计算机系统中,存储是以字节为单位的,每一个地址单元都对应着一个字节,1byte=8bit;从语言中处理有1byte的char类型还有2byte的short,4byte的int等等

,char自己就只占1字节固然没有问题,可是int是4字节,这时就会产生4字节在寄存器中存放的位置的问题.xml

定义

大端:把数据的高位字节放在内存的低位地址处,把数据的低位字节放在内存的高位地址处

小端:把数据的低位字节放在低位地址处blog

判断大小端的方法

方法一:图片

void main()

{

int num=0x12345678;

char* p=(char*)& num;

//经过将int(4字节)强转换成char单字节p指向num的起始字节(低字节)

if(*p==0x78)

{

//低字节存放在低位置处

printf(“小端\n”);

}

else

{

printf(“大端\n”);

}

}

方法二

void main()

{

//原理:联合体union的存放顺序是全部成员都从低地址开始存放,并且全部成

//员共享存储空间

union A

{

int num;

char ch;

}

union A p;

p.num=0x12345678;

if(p.ch==0x78)

{

//低字节存放在低位置处

printf(“小端\n”);

}

else

{

printf(“大端\n”);

}

}内存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值