C语言结构体使用注意事项

结构体是类似于名片形式的数据集合体,可以把它理解为一种由用户自定义的特殊的复合型的“数据类型”,在这个复合型的“数据类型”中可以包含多种基本数据类型,我们可以把它作为一个整体来操作。

一、关于结构体

在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。

结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

结构体的定义如下所示:

struct tag { 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;
int cc;
};

struct stu stu1, stu2;
方法2:

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

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

struct stu stu3;
方法3:

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

struct
{
char aa;
short bb;
int cc;
}stu1, stu2;
提示:

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

struct stu3;
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;
int cc;
}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. 分析不一样原因

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

结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节; 对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:

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

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

最后,强调一下,学习编程,不能只看书,要多敲代码。

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/12120.html

(0)
晴川运维晴川运维
上一篇 2025年7月9日
下一篇 2025年7月9日

相关推荐

  • 通过python判断IP地址

    本篇文章重点为大家讲解一下通过python判断IP地址的具体方法,有需要的小伙伴可以参考一下。 输入一串字符,判断该字符串是否为点分十进制的IP地址,若是则转换为16进制输出,否则…

    Linux系统 2025年10月9日
  • Linux mount命令详解:挂载Linux系统外的文件

    《Linux挂载》一节讲到,所有的硬件设备必须挂载之后才能使用,只不过,有些硬件设备(比如硬盘分区)在每次系统启动时会自动挂载,而有些(比如 U 盘、光盘)则需要手动进行挂载。 通…

    Linux系统 2025年10月5日
  • 讲解一下JavaScript中的对象

    我们知道生活中客观存在的一切事物皆为对象,那在程序中的对象是什么样子呢?我们可以将程序中的对象理解为客户端世界中的对象在一种计算机中的一种表示方式.所有的编程语言中提到的对象其性质…

    Linux系统 2025年9月22日
  • Ansible:像系统管理员一样思考的自动化框架

    这些年来,我已经写了许多关于 DevOps 工具的文章,也培训了这方面的人员。尽管这些工具很棒,但很明显,大多数都是按照开发人员的思路设计出来的。这也没有什么问题,因为以编程的方式…

    Linux系统 2025年9月21日
  • 详解YARN常用操作

    YARN (Yet Another Resource Negotiator,另一种资源协调者)是一 种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应…

    Linux系统 2025年6月23日
  • 通过Nginx反向代理实现kibana登录认证

    Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操…

    Linux系统 2025年10月21日
  • 通过Memcached实现session server会话保持

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度…

    Linux系统 2025年10月21日
  • CoreOS具体安装方法

    CoreOS是一个基于Linux 内核的轻量级操作系统,为了计算机集群的基础设施建设而生,专注于自动化,轻松部署,安全,可靠,规模化,CoreOS作为Docker生态圈中的重要一员…

    Linux系统 2025年10月27日
  • Linux Tee 命令使用实例

    Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,那么可以用到tee…

    Linux系统 2025年6月8日
  • 细说Shell test 命令

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,下面为大家讲解一下Shell test 命令。 数值测试 参数 说明 -…

    Linux系统 2025年10月21日

发表回复

登录后才能评论