学习笔记 - 结构体与字节对齐控制指针结构(一)

前言
看了lwip的源代码,对结构体类型的指针操作一段内存的指定位置有了一些新的理解,如果要操作一段内存中,如0X00~0X03处这四个字节大小的内存,那么我们可以自己定制一个四个字节大小的结构体来随意操作(前提是要取消掉字节的默认对其),gcc在编译第二阶段(头文件和宏展开后的下一阶段,转换成汇编语言)会处理c语言中的字节对齐命令(#pragma pack(n) )

字节对齐命令的处理位置

字节对齐命令
#pragma pack(n) //以下的数据采用n字节对齐
#pragma pack() // 与上面的命令连用,恢复缺省字节对齐值
代码部分

// 1_main.c // 采用1字节对齐方式
#pragma pack(1)
struct test{
uint8_t u8 ;
uint16_t u16 ;
};
#pragma pack()
struct test test_1 ;
// 4_main.c // 采用4字节对齐方式(大多数编译器的缺省值)
#pragma pack(4)
struct test{
uint8_t u8;
uint16_t u16;
};
#pragma pack()
struct test test_4 ;

编译到第二阶段时的不同之处
在这里插入图片描述
编译到第三阶段的不同之处
学习笔记 - 结构体与字节对齐控制指针结构(一)_第1张图片
编译到第四阶段的不同之处(这里要留意)
学习笔记 - 结构体与字节对齐控制指针结构(一)_第2张图片
程序段头表完全一样!!!这里就不放了
size命令查看的信息也完全一样!!!这里也不放了
不知道为什么,放几个图片就写的不正常了,接下来的部分放在另一篇里面吧

你可能感兴趣的:(学习笔记 - 结构体与字节对齐控制指针结构(一))