返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中#pragma pack(1)的用法与注意点
  • 356
分享到

C语言中#pragma pack(1)的用法与注意点

摘要

目录一:何时使用二. 为什么使用#pragma pack(1)三.注意点四.#pragma pack()的一些用法五.题目附: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)的用法与注意点的文章就介绍到这了,更多相关C语言#pragma pack(1)用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中#pragma pack(1)的用法与注意点

本文链接: https://lsjlt.com/news/196915.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言中#pragma pack(1)的用法与注意点
    目录一:何时使用二. 为什么使用#pragma pack(1)三.注意点四.#pragma pack()的一些用法五.题目附:C语言慎用#pragma pack(1)命令总结一:何时...
    99+
    2023-02-21
    c语言 #pragma pack(1) c语言中pragma怎么用 pragma使用例子pack
  • C语言中的#pragma pack(1)如何使用
    这篇“C语言中的#pragma pack(1)如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的#pragma...
    99+
    2023-07-05
  • C语言中#pragma once的作用
    目录1、#pragma once有什么作用?2、两者的使用方式有何区别?3、两者各有何特点?(1)#ifndef(2)#pragma once4、两者之间有什么联系?1、#pragm...
    99+
    2024-04-02
  • c语言pragma的用法是什么
    `#pragma` 是一个编译指令,用于告诉编译器执行特定的操作或者设置特定的编译选项。在C语言中,`#pragma` 可以用于以下...
    99+
    2023-09-04
    c语言
  • C语言中return用法 return 1什么意思
    在C语言中,return关键字用于函数的结束和返回值的传递。当函数执行到return语句时,函数将会立即结束,并返回return后面...
    99+
    2023-08-18
    C语言
  • C语言详细讲解#pragma的使用方法
    目录一、#pragma 简介二、#pragma message三、#pragma once四、#pragma pack五、小结一、#pragma 简介 #pragma 用于指示编译器...
    99+
    2024-04-02
  • C语言 详细讲解#pragma的使用方法
    #pragma是C语言中的预处理指令,用于告诉编译器在编译过程中采取特定的行为。以下是#pragma的使用方法的详细讲解:1. #p...
    99+
    2023-08-08
    C语言
  • C语言中注释与注意事项的深入讲解
    C语言注释简介: 注释应该出现在三种位置 文件头部 函数头部 函数体内的和代码混在一起的注释 对于文件头部的注释至少列出: 版权声...
    99+
    2024-04-02
  • C语言中scanf函数的用法及注意事项
    C语言中scanf函数的用法及注意事项 作为C语言中最常用的输入函数之一,scanf函数在程序开发中具有重要的作用。它能够从标准输入流(键盘)中接收用户输入的数据,并将其存储到指定的变...
    99+
    2024-02-22
    函数 c语言 scanf
  • C语言指针的使用技巧与注意事项
    C语言指针的应用技巧与注意事项 一、引言 作为一种面向过程的编程语言,C语言具有高效、灵活的特点。而指针则是C语言中一个非常重要的概念,对于理解和掌握C语言来说至关重要。本文将介绍C语...
    99+
    2024-02-26
    传递 动态内存 野指针 注意事项:空指针
  • c语言中case的意思和用法
    c 语言中,case 关键字用于 switch 语句,指定要执行的代码块,每个 case 语句包含一个常量和一个代码块,当表达式与常量匹配时执行代码块,若没有匹配,则执行 default...
    99+
    2024-05-12
    c语言
  • C语言 volatile与const同时使用应注意的问题
    const和volatile放在一起的意义在于: (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;(2)另一个程序段则完全有可能修改...
    99+
    2022-11-15
    C语言 volatile const
  • C语言中.与->的用法介绍
    目录(一)基础(二)例子(三)总结(一)基础 结构体用点,结构体指针用箭头。 a->b 的含义是 (*a).b 。  现代的标...
    99+
    2023-05-20
    C语言中.与->的区别 C语言->用法
  • 一起来看看C语言的预处理注意点
    目录C 预处理器1.取消已定义宏2.使用#ifdef来调试常用预定义宏预处理器运算符 1.宏延续运算符2.字符串常量化运算符#3.标记粘贴运算符##参数化的宏总结C 预处理...
    99+
    2024-04-02
  • C语言与C++中const的用法对比
    目录一、C语言中的const二、C++中的const三、进一步比较C和C++中的const四、const与宏的区别五、小结一、C语言中的const const修饰的变量是只读的,本质...
    99+
    2024-04-02
  • c#调用c语言dll需要注意的地方
    目录一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有...
    99+
    2024-04-02
  • C++与C语言常用的语法对比
    目录前言1.头文件2.结构体struct3.动态数组的创建与删除4.函数顺序问题5.类(class)前言 本人在校学习的第一门语言是C++,由于操作系统这门课程实验的需要,要求在li...
    99+
    2024-04-02
  • 老手必备:C语言中*和&的技巧与注意事项
    c语言中,表示指针,存储其他变量的地址;&表示地址运算符,返回变量的内存地址。指针的使用技巧包括定义指针、解引用指针,需确保指针指向有效地址;地址运算符&的使用技巧包括获...
    99+
    2024-04-04
    技巧 c语言
  • C语言中使用break要注意哪些事项
    在C语言中,使用break语句时需要注意以下几点事项:1. break只能用于循环语句和switch语句中,用来跳出当前循环或swi...
    99+
    2023-10-12
    C语言
  • c语言中?:的用法
    c 语言 : 运算符,又称三元条件运算符,根据条件执行不同代码块,语法:condition true_expression : false_expression。它首先求值条件,真则执...
    99+
    2024-04-27
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作