0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言结构体用法很多,但是坑也很多

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-01-13 16:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

C语言可谓是编程界的传奇语言,历经几十年,依然排名前列。 前不久还写了一篇文章《2019年11月C语言接近Java》,说了C语言是比较受欢迎的一种语言,有望在年底超过JAVA,再次成为第一名。 本文主要说的是C语言中的结构体,结构体是C语言中重要的一部分内容,也是C语言中常用的一种数据结构。 一、关于结构体在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。 结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 结构体的定义如下所示:

structtag{member-list}variable-list; 其中:

struct为结构体关键字;

tag为结构体的标志;

member-list为结构体成员列表,其必须列出其所有成员;

variable-list为此结构体声明的变量。

在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。二、结构体常规定义不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。

方法1:

定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.

struct stu{ char aa; short bb;intcc;}; struct stu stu1, stu2;

方法2:

定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.

struct stu{ char aa; short bb;intcc;}stu1, stu2; struct stu stu3;

方法3:

定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。

struct{ char aa; short bb;intcc;}stu1, stu2;

提示:

这里不能像上面再定义结构体变量:(以下错误)

structstu3;struct stu stu3;

三、使用typedef定义结构体这里先简单说下typedef.

在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。 维基百科

方法4:

使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。

typedef struct stu{ char aa; short bb;intcc;}STU; STU stu1;

你会发现,其实就是通过关键字typedef,将STU取代了struct stu。

当然,也可以这么用:

struct stu stu1;

上面这种定义就失去了typedef的意思,所以不推荐。

方法5:

使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。

typedef struct{ char aa; short bb; int cc;}STU; STU stu1;

方法6:

还有一种符合语法规则,但意义不大的定义方式。

typedef struct stu{ char aa; short bb; int cc;}; struct stu stu1;

以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。

四、结构体大小计算

结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。

1.对比两结构体大小,一样吗?

结构体1:

struct stu{ char aa; short bb; char cc;}stu1;

结构体2:

struct stu{ char aa; char bb; short cc;}stu2;

答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4. 2.分析不一样原因

结构体计算要遵循字节对齐原则,一般满足三个准则:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节;

对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:

2个字节

第一个char占一个字节 多的这一个补0,只是占位作用
short 刚好占2个字节
第二个char也占1个 多的这一个补0


对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:

第一个char占一个字节 第二个char占一个字节
short 刚好占2个字节

通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DIY避指南向|车载功放DIY别瞎买芯片!CD7377CZ/CD7388实操避全攻略

    很多电子发烧友DIY车载功放时,都栽在芯片选型和电路调试上:要么选的芯片和喇叭不匹配,要么调试时出现杂音、烧芯片。结合我用CD7377CZ/CD7388 DIY的实操经验,总结出这份避指南,新手
    的头像 发表于 12-09 11:15 115次阅读

    单片机C语言编程的心得

    写这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结
    发表于 12-08 07:44

    为什么单片机还在用C语言编程?

    的缺陷 高级语言存在的目的是可以实现更为优化的算法,更多的是为了方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言
    发表于 11-28 07:37

    C语言程序的结构

    ,87LPC764有4KB的Flash ROM,而笔者的程序量只有2KB多点,因而第一个想法是改用C语言作为主要的开发语言,应该不至于导致代码空间不够用。其次,考虑到需要定时功能的模块(或称任务,以下统称任务
    发表于 11-26 08:12

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达
    发表于 11-25 07:48

    STM32 5 个容易踩的外设使用技巧

    STM32是嵌入式开发领域的热门MCU,功能丰富到几乎可以完成所有常见控制任务:GPIO、ADC、UART、定时器、DMA……应有尽有。但是,正因为功能强大,开发中踩的机会随之增多。很多
    的头像 发表于 11-24 19:04 521次阅读
    STM32 5 个容易踩<b class='flag-5'>坑</b>的外设使用技巧

    C语言和单片机C语言有什么差异

    汇编语言机器才能读懂,所以每个平台的编译器编译成对应平台汇编的程序,每个平台的汇编不一样,当然编译器不一样。 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的编译器。具体
    发表于 11-14 07:55

    C语言结构体使用

    型的数据组合。 结构体的声明与定义 结构体的声明一般形式为: c struct 结构体名{ 成员1; 成员2; ... }; //注意分号 例如:
    发表于 11-12 08:30

    C语言的printf基本用法介绍

    中使用频率最高的一个函数一点不为过,每个C语言程序员都应该掌握 printf 的用法,这是最基本的技能。 不过 printf 的用法比较
    发表于 11-12 07:04

    提高篇——C语言核心技术(中文版)

    该资料是“C编程语言”和“C语言链接库”的完整参考手册。这本书的目的是提供一本方便、可靠的手册,辅助日常的编程工作。本书描述C
    发表于 06-13 16:39

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循
    的头像 发表于 04-29 18:49 1740次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    必看!15个C语言常见陷阱及避指南

      C语言虽强大,但隐藏的“不少!稍不留神就会导致程序崩溃、数据异常。本文整理15个高频陷阱,助你写出更稳健的代码!   陷阱1:运算符优先级混淆  问题:运算符优先级不同可能导
    的头像 发表于 03-16 12:10 1384次阅读

    源代码加密、源代码防泄漏c/c++与git服务器开发环境

    源代码加密对于很多研发性单位来说是至关重要的,当然每家企业的业务需求不同所用的开发环境及开发语言不尽相同,今天主要来讲一下c++及git开发环境的源代码防泄密保护方案。企业源代码泄密
    的头像 发表于 02-12 15:26 879次阅读
    源代码加密、源代码防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c</b>++与git服务器开发环境

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存泄漏。 大家觉得,这样的代码设计有没有问题。 代码是某位学员在
    的头像 发表于 02-11 09:31 678次阅读

    ads1191做ecg波形纹波很多是哪里出了问题?

    滤波器都加上了,但是就是纹波多,之前有一次测试纹波好很多,不知道是RLD电路问题还是哪里的问题?
    发表于 01-10 08:34