#pragma pack需要成对出现,若不成对出现会造成异常,难以调查。
现有5个文件,分别是main.c,A.h,A.c,B.h,B.c。
A.h文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#pragma pack(1)
typedef struct _a_align_1_bytes_
{
unsigned char a1;
unsigned char a2;
}a_align_1_bytes;
//#pragma pack() // 先注释掉
A.c文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#include "A.h"
#include "B.h"
extern b_align_x_bytes b_test;
void print_address_test_in_a(void)
{
printf("%s b_test.b4 address:%p\r\n", __func__, &b_test.b4);
}
B.h文件内容如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct _b_align_x_bytes_
{
unsigned char b1;
unsigned int b4;
}b_align_x_bytes;
B.c文件内容如下:
#include <stdio.h>
#include <stdlib.h>
#include "B.h"
b_align_x_bytes b_test;
void print_address_test_in_b(void)
{
printf("%s b_test.b4 address:%p\r\n", __func__, &b_test.b4);
}
main.c文件内容如下:
#include <stdio.h>
#include <stdlib.h>
void print_address_test_in_a(void);
void print_address_test_in_b(void);
int main()
{
print_address_test_in_a();
print_address_test_in_b();
printf("Hello world!\n");
return 0;
}
编译,运行,结果如下:
在A.c文件和B.c文件内输出的同一个变量的地址结果不同。
这是因为在A.c文件内先包含A.h,后包含B.h,A.h中的pragma pack 按1字节对齐后,非成对出现,对齐方式没有结束,在B.h中也按照1字节对齐,因此在A.c文件中的地址为1字节地址。
B.c文件仅包含了B.h文件,因此是按照4字节对齐方式进行。
这种问题可能不会出现程序运行错误、直接退出,有时非常隐蔽,难于发现。因此,在进行第一次编辑时一定要成对出现。
在A.h文件中加入pragma pack(),成对出现,运行如下: