文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言中的#pragma pack(1)如何使用

2023-07-05 04:32

关注

这篇“C语言中的#pragma pack(1)如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的#pragma pack(1)如何使用”文章吧。

一:何时使用

#pragma pack(1)的用法大多是用在结构体中

二. 为什么使用#pragma pack(1)

结构体的字节对齐方式在不同的编译器中不同,会存在数据冗余,以下举个例子

 struct example    {        char header_start;        double data_type;    };

现有的结构体,就会按照结构体成员中最大的数据类型对齐,例子当中就是double型,按照8个字节进行对齐。那么此时sizeof(example)就是16,存在7个空字节,因为其中char只占一个字节

如果加上#pragma pack(1),那么example按1个字节对齐方式对齐,此时sizeof(example)就是等于9

三.注意点

这种方法的使用一定要是成对使用,如下面例子

#pragma pack(1)struct example    {        char header_start;        double data_type;    };#pragma pack()

我们一定要在结构体末尾加上#pragma pack()进行取消自定义字节对齐的命令,如果不取消,可能会导致整个程序存在问题。因为会影响到其他的结构体对齐方式

四.#pragma pack()的一些用法

#pragma pack(show) //显示当前内存对齐的字节数,编辑器默认8字节对齐

#pragma pack(n) //设置编辑器按照n个字节对齐,n可以取值1,2,4,8,16

#pragma pack(push) //将当前的对齐字节数压入栈顶,不改变对齐字节数

#pragma pack(push,n) //将当前的对齐字节数压入栈顶,并按照n字节对齐

#pragma pack(pop) //弹出栈顶对齐字节数,不改变对齐字节数

#pragma pack(pop,n) //弹出栈顶并直接丢弃,按照n字节对齐

五.题目

牛牛需要建立一个结构体Nowcoder,该结构体包括三个成员,其类型分别是int、double和char。假设牛牛想让这个结构体所占据的内存最小,请问你该怎么建立该结构体?(输入三个相应类型的变量用于初始化结构体)

示例1

输入:1,1.000,a
返回值:13

代码

  #pragma pack(1)struct Nowcoder{    char c;    int n;    double d;}; int smaller_space(int n, double d, char c ) {    // write code here    struct Nowcoder temp;    temp.c=c;    temp.n=n;    temp.d=d;    return sizeof(temp);}

附:C语言慎用#pragma pack(1)命令

在我们在按字节传输一些数据的时候,肯定会定义一些结构体,但是结构体的字节对齐方式可能在不同的编译器中不一样,这样会在数据传输过程中增加冗余的数据。

为了方便数据传输,我们可以用#pragma pack(1)命令,将结构体里的变量强制进行1字节对齐,但是我们在用完这个命令后,一定要在定义的数个结构体后加一个取消自定义字节对齐的命令:#pragma pack(),如果不取消就可能导致整个程序都会有问题,因为这个命令会影响到其它的结构体的字节对齐方式,但并不会全部全部影响(推测)。正确用法是:

#pragma pack(1)typedef struct{.......} xxxxx;typedef struct{.......} xxxxx;........#pragma pack()

以上就是关于“C语言中的#pragma pack(1)如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯