#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(),成对出现,运行如下:




















