逆向基础之结构体对齐

遵循以下原则,数据成员对齐;结构体大小;结构体有某些成员大,最大对齐,对齐参数笔结构体的sizeof小,偏移以此为准。

struct

{

char a;

int b;

char c;

}

a 1b,补3

b  4b

c 1b,补三

struct

{

int a‘;

char b;

char c;

}

a 4b;

b c 补2

对齐原因为了在效率或者空间上面做优化。

原文地址:https://www.cnblogs.com/kk328/p/9800805.html

时间: 2024-10-11 20:15:54

逆向基础之结构体对齐的相关文章

解析C语言结构体对齐(内存对齐问题)

C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久.其实相关的文章很多,感觉说清楚的不多.结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1.数据成员对齐规则:结构(struct或

结构体对齐详解【转】

 1 -- 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度.比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个

结构体对齐规则

结构体对齐规则: (1)第一个成员在与结构体变量偏移量为0处 (2)其他成员变量需要对齐到某个数字(对齐数)的整数倍的地址处 对齐数=编译器默认的一个对齐数与该成员大小的较小值 VS中默认为8 (3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍 (4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍 #include <stdio.h> #include <stddef.

C语言结构体对齐

1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来访问.(.和->访问结构体元素其实质是一样的,只是C语言规定用结构体变量来访问元素用. 用结构体变量的指针来访问元素用->.实际上在高级语言中已经不区分了,都用.)(3)结构体的访问方式有点类似于数组下标的方式 2.利用指针访问结构体元素 结构体元素地址=结构体首地址+元素偏移量 struct m

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

1:简单理解,结构体就是数组的进一步发展,数据的优点和缺陷在于数据里面是元素类型必须相同,但是结构体没有这个要求,结构体里面元素的类型可以相同也可以不同. 2:结构体的定义: struct student {     int age;     char name[20]; }s1; 上面这种方法是结构体定义的同时定义变量,结构体的定义有两部分组成 struct studen:结构体的类型 s1:类型为struct student的结构体变量,当然还可以用struct studet s2:l来定义

结构体对齐

结构体对齐详解 1 .结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).这种强制的要求简化了处理器与内存之间传输系统的设计. 比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只

[C/C++基础] 3.结构体、共用体、枚举

概述: 结构体和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,其次相同结构的结构体变脸是可以相互赋值的. 共用体(联合体)和结构体都是由多个不同的数据类型成员组成,但在任何同一时刻,共用体值存放了一个被选中的成员.而结构体的所有成员都存在. C++的枚举(enum)工具提供了另外一种可以替代const来创建符号常量的方式,枚举表是枚举常量的集合. 3.1 结构体struct 结构体类型变量的定义一般形式为: struct 结构体类型名{ 类型1 成员名1; 类型2 成员名2;

linux中结构体对齐【转】

转自:https://blog.csdn.net/suifengpiao_2011/article/details/47260085 linux中定义对齐字节 typedef struct  sdk_handler { char comm_ver[10];  char name[20]; char reserve[20]; }PACKED  sdk_handler_t; #define PACKED //__attribute__((aligned(1),packed))  // 一字节对齐 首

C结构体对齐

函数模板针对仅参数类型不同的函数? http://blog.csdn.net/renrenhappy/article/details/5931457 计算结构体的大小就要考虑数据对齐问题. 为了使CPU的存取速度最快, 在处理数据的时候把结构变量中的成员大小按照4或8的倍数计算, 这是因为数据总线的宽度一般为4字节或者8字节. 可加上#pragma pack(n)的设定. 缺省情况下, 编译器为结构体的每个成员按其自然对界条件分配空间(即按照结构体成员之中最大的成员对齐). 默认的字节对齐准则如