#pragma pack不成对出现造成的异常

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值