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

news2024/9/21 22:42:28

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ylb-接口14购买理财产品

总览&#xff1a; 在api模块service包&#xff0c;Invest类下添加&#xff08;投资理财产品&#xff0c; int 是投资的结果 &#xff0c; 1 投资成功&#xff09;&#xff1a; package com.bjpowernode.api.service;import com.bjpowernode.api.pojo.BidInfoProduct;import j…

go mod vendor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包&#xff0c;它具有以下优点&#xff1a; 复制依赖&#xff1a;go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中&#xff0c;所以即使这些依赖包在外部源&#xff08;如 GitHu…

MySQL 约束、聚合查询和联合查询练习

1. 数据库约束 设置一个考勤系统, 包含员工表&#xff0c;考勤记录表 首先要明白, 员工表对考勤记录表是一对多 员工表中起码包含 id , name 考勤记录表则包含 id, 日期, 考勤记录 考勤记录表为子表, id 则为外键约束 员工表为父键, id则为主键约束 搞明白这些, 接下来就…

【C语言】矩阵相乘

#include <stdio.h>#define M 3 #define N 4 #define P 3void fun(int a[M][N], int b[N][P], int m, int p, int n)//定义函数fun {printf("m: %d, p: %d, n: %d\n", m, p, n);int c[M][P]{0};int i, j, k;for(i 0; i < m; i){for(j 0; j < n; j){fo…

【数据结构】朴素模式匹配 KMP算法

&#x1f387;【数据结构】朴素模式匹配 & KMP 算法&#x1f387; &#x1f308; 自在飞花轻似梦,无边丝雨细如愁 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;【数据结构】朴素模式匹配 & K…

IDEA中设置鼠标滚轮修改字体大小

IDEA中设置鼠标滚轮修改字体大小&#xff1f; 选择File--Settings--Editor--General&#xff0c;把 Mouse Control 前的对勾勾选 后点击 OK 即可。 勾选此设置后&#xff0c;增加 Ctrl 鼠标滚轮 快捷键来控制代码字体大小显 示。字体随时可以放大缩小~~可真好用呢~

IDEA运行TOMCAT出现404

就这种问题&#xff0c;每个人的原因都不一定一样&#xff0c;我出现这种问题的解决方法在这里记录一下。顺便把我的配置记录一下。 除了本文的问题&#xff0c;还有可能是默认打开的文件名错了&#xff0c;或者端口被占用。 软件版本IDEA2023 TOMCAT9 亲测&#xff1a;IDE…

❤️创意网页:如何使用HTML制作漂亮的搜索框

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

pycharm python 函数添加注释 快捷键

写完函数定义后,在函数名下面点击,并按下敲入""",完后回车,这会自动生成函数的文档注释格式 完后找我要插件,会阅读函数的内容,自动生成注释的内容.

RootThis靶机复盘

RootThis靶机复盘 在这个靶机中收获良多&#xff0c;首先学会了一个新的交互方式&#xff0c;不需要用python了&#xff0c;同时知道了什么是静态链接文件&#xff0c;还有就是学会了遇到数据库文件应该怎么解决。 /usr/bin/script -qc /bin/bash /dev/null 静态链接版本的程…

openpnp - 相机图像亮度太高的解决方法

文章目录 openpnp - 相机图像亮度太高的解决方法概述笔记设置相机的合适参数白平衡END openpnp - 相机图像亮度太高的解决方法 概述 看到同学在群里讨论问题, 说相机补光灯亮度太高了, 导致openpnp图像惨白惨白的, 根本不能用. 能根本解决问题的方法, 就是群里同学说的, 用恒…

Linux —— 进程状态

目录 一&#xff0c;进程状态分类 二&#xff0c;僵尸进程 三&#xff0c;孤儿进程 一&#xff0c;进程状态分类 进程状态反应进程执行过程中的变化&#xff0c;状态会随外界条件的变化而转换&#xff1b; 三态模型&#xff0c;运行态、就绪态、阻塞态&#xff1b;五态模型…

PyTorch: 权值初始化

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 Pytorch&#xff1a;权值初始化梯度消失与梯度爆炸 Xavier 方法与 Kaiming 方法Xavier 方法nn.init.calculate_gain…

Spark3新特性

Spark AQE 自适应查询优化&#xff1a; 实现运行时优化&#xff0c;纠正因统计信息不准确导致生成的逻辑计划不完善或有误的问题 动态调整JOIN策略&#xff1a;类似于mapjoin优化&#xff0c;将sortMergejoin转换成broadcasthashjoin&#xff0c;也就是将小表当作广播变量分发…

基于深度学习的高精度线路板瑕疵目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度线路板瑕疵目标检测系统可用于日常生活中来检测与定位线路板瑕疵目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的线路板瑕疵目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

SpringBoot+Vue实现的高校图书馆管理系统

项目描述&#xff1a;这是一个基于SpringBootVue框架开发的高校图书馆管理系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代码简洁规范&#xff0c;注释说明详细&#xff0c;易于理解和学习。其次&#xff0c;这项目功能丰富&#xff0c;具有一个高校图书馆管理系…

外包软件定制开发中知识保护和安全性问题及解决方案

引言 外包软件定制开发在当今的商业环境中越来越普遍&#xff0c;它为企业提供了灵活性和成本效益。然而&#xff0c;与外包合作也带来了一些风险&#xff0c;其中最重要的就是知识保护和安全性问题。在外包软件定制开发过程中&#xff0c;共享敏感信息和知识产权是不可避免的…

redis基本操作

string数据类型的命令操作 设置键值 使用append 命令设置键值&#xff0c;后面跟键的名字&#xff0c;可以先判断该建是否存在&#xff0c;存在将值追加在后面&#xff0c;不存在自动添加该建 append mykey hello读取键值 get mykey数值类型自减1 数值类型自加1 查看值的…

记录C#知识点(二)21-40

目录 21.性能优化 22.动态dynamic使用 23.中文乱码 24.启动项目之前&#xff0c;执行文件 25.深拷贝-反射实现 26.丢弃运算符 _ 27.winform程序使用管理员运行 28.wpf程序使用管理员运行 21.性能优化 1.检查空字符串&#xff1a;使用string.Empty 2.更改类型转换&…