文章开始之气那,给大家分享一个C语言在线练习的网站(本人常用):C语言在线练习

struct的作用

一般来说,区别一个开发人员是否具备丰富开发经历的标志在于其会不会使用struct,怎么使用strcut
在网络协议、通信控制、嵌入式系统的编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。
初级的开发人员往往将所有需要传送的内容依顺序保存在char 型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改。
一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协议中需要传送三种报文,其格式分别为packetA、packetB、packetC

typedef struct StructA {int a;char b;
} A;
typedef struct StructB {chara;shortb;
} B;
typedef struct StructC {int a;char b;float c;
} C;

报文结构设计

typedef enum PacketType{PacketTypeA = 1,PacketTypeB,PacketTypeC
};
struct CommuPacket {PacketType type;  < 报文类型union {          < 每次传输的是其中的一种,因此使用unionA packet_a;B packet_b;C packet_c;}
};

报文传输设计

/* pSendData 发送字节流的首地址len 发送数据长度
*/
void Send(char *pSendData, unsigned int len);
/* pRecvData 接收缓冲区首地址len 接受长度 返回值:实际接收长度
*/
unsigned int Recv(char *pRecvData, unsigned int len);

判断报文类型,并作相应处理

switch(type) {case PacketTypeA :...break;case PacketTypeB :...break;case PacketTypeC :...break;
}

struct成员对齐

自然对齐

struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float 等)的变量,也可以是一些复合数据类型(如array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size 最大的成员对齐。

struct Natural {char a;short b;char c;
}

在上面的这个结构体中,size最大的数据类型为short,长度为两个字节。因此,结构体中所有成员变量都以2为单位对齐。
其大小为sizeof(Natural) = 6

指定对界

一般使用预处理指令#pragma pack来改变缺省的对界条件

  • 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐
  • 使用伪指令#pragma pack (),取消自定义字节对齐
  • 如果#pragma pack (n)中指定的n 大于结构体中最大成员的size,则其不起作用,结构体仍然按照size 最大的成员进行对界
#pragma pack (n)
struct Natural {char a;int b;char c;
};
#pragma pack ()

当n 为4、8、16 时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n 为2时,其发挥了作用,使得sizeof(Natural)的结果为6。

  • 通过__attribute((aligned (n)))也可以让所作用的结构体成员对齐在n 字节边界上,但它使用较少

深入探索C语言struct的用法相关推荐

  1. C语言struct 函数,c语言struct的用法

    C语言中先申明结构体,也就是定义结构体具体形式,而后可以把它当做普通数据类型来修饰变量,也可以在定义类型时后面直接跟着定义几个变量,下面小编就为你介绍c语言struct的用法. 基本定义:结构体,通俗 ...

  2. c语言struct的作用和用法,c语言struct用法详解

    c语言struct用法详解 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为:struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包 ...

  3. Go语言MD5加密用法实例

    Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (     "crypto/md5" ...

  4. 6s在c语言中的用法,C语言中assert的用法讲解

    assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.下面是小编为大家整理的C语言assert的用法讲解,欢迎参考~ assert宏的原型定 ...

  5. C语言 qsort的用法 模拟EXCEL排序

    C语言 qsort的用法 模拟EXCEL排序 题目 Excel可以对一组记录按任意指定列排序.现请编写程序实现类似的功能. 输入 输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录 ...

  6. linux c语言 select函数用法

    原文地址:点击打开链接 linux c语言 select函数用法 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 co ...

  7. C语言栈的用法(创建、入栈、出栈、遍历)

    C语言栈的用法(创建.入栈.出栈.遍历) 本篇博客主要简单介绍如何使用C语言构建栈,元素入栈,元素出栈以及遍历所有的栈内元素 1.栈的定义 首先对栈进行定义,构建一个简单的结构体,采用typedef ...

  8. c语言链表head的作用,c语言链表的用法

    c语言链表的用法 链表是数据结构中比较基础也是比较重要的类型之一,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪里?下面小编就为大家介绍下c语言链表的用法. c语言枚举的用 ...

  9. 用JAVA定义两个结构体_c语言struct结构体的定义和使用

    c语言由于不像java,c#,c++等语言有对象,所以就用struct结构体来表示,其实作用是差不多的,下面来快速学习c语言struct结构体的定义和使用,以学生类student来举例,有三种定义方式 ...

最新文章

  1. 百度全面开放HTTPS之我见
  2. c++如何将两个if函数合并_设计一个 add 函数
  3. excel筛选排序从小到大_excel表格怎么按字数的多少来排列!
  4. html中的特殊符号
  5. 第四章 自上而下分析
  6. fedora16 解码方案
  7. 公司买网络设备,至少16口
  8. 使用DALSA采集卡进行采图(C#版)
  9. Web敏感目录快速扫描软件 wwwscan
  10. 常平计算机培训班,东莞常平十大CAD培训班排名(如何为初学者学习CAD)
  11. NetLog 大规模应用实战:Database-sharding 技术
  12. vue前端上传文件夹的插件_vue文件上传插件
  13. 实验室设备管理系统(C语言实现)
  14. 【重温经典】《谁谋杀了我们的游戏?》出自《黑神·话悟空》制作人Yocar
  15. 2022双十一最亮投影仪推荐,当贝X3激光投影3200ANSI流明超高亮度
  16. 【Unity】U3D TD游戏制作实例(五)防御塔设计:对象排序、锁定敌人、攻击敌人、防御塔特色功能实现
  17. 阿里云盘登录空白问题解决
  18. 迭代器、模块的简单总结
  19. 优维EasyOps®全平台又一波新功能上线,操作体验更带劲
  20. 关于numeric_limits

热门文章

  1. 六足蜘蛛机器人+哈尔的移动城堡,一个神奇组合的设计制作!
  2. arp病毒系列——攻击类型
  3. linux 虚拟钢琴程序,基于 Linux 与 VS1003 的 MIDI 电子节拍器的设计与实现,为乐器演奏(如钢琴、吉他)...
  4. 阿米巴管理模式适合什么类型的企业
  5. java javawebjsp图书借阅系统(jsp图书管理系统 )jsp书籍借阅系统
  6. 从零开始学matplotlib画图(五): 饼图及环形图
  7. 计算机辅助测试题,2017计算机辅助设计练习题
  8. bmi系统模块设计java_BMI体脂计算器 app源码
  9. 云原生数据库的下一次变革发生在哪里?
  10. 一加5t升级 android p,第三方速度够快,一加1、一加5和一加5T火速升级AndroidP