C语言结构中有很多陷阱。 这6个方法一定要记住!

 2024-03-16 04:05:54  阅读 0

这篇文章的好处在文末!

C语言可以说是编程界的传奇语言。 几十年过去了,依然位居前列。

本文主要讲C语言中的结构体。 该结构体是C语言的重要组成部分,也是C语言中常用的数据结构。

1、关于结构体 在C语言中,结构体()指的是一种数据结构,它是C语言中复合数据类型(数据类型)的一种类型。

结构体可以声明为变量、指针、数组等,以实现更复杂的数据结构。 结构也是元素的集合。 这些元素被称为()结构,并且这些成员可以是不同的类型。 通常通过姓名来访问成员。

该结构体的定义如下:

 struct tag { member-list } variable-list; 

在:

一般情况下,tag、-list、-list这三个部分至少必须出现其中的两个。

2.结构体的常规定义有不同的定义,并且用于不同的场景。 因此,在编程时,我们需要根据实际情况来定义结构体。

方法一:

定义结构 Stu。 这时结构体就相当于一个类型,比如int。 如果需要使用该结构体,方法与int相同。

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

方法二:

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

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

方法三:

定义结构体时,默认结构体名称,同时定义结构体变量stu1和stu2。 但是,结构变量不能在以后定义。

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

暗示:

不能像上面那样在这里定义结构变量:(错误如下)

struct stu3; 
struct stu stu3;

3、简单说一下定义结构的使用。

在 C 和 C++ 编程语言中, 是一个关键字。 它用于为数据类型提供别名,以使源代码更易于阅读和理解。 它通常用于简化声明由复杂类型组成的结构,但也经常出现在各种长度的整数数据类型中,例如 和 。

维基百科

方法四:

在使用定义结构体时,给stu结构体起一个别名STU。 后续定义不需要使用stu,直接使用STU即可。

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

你会发现STU其实是通过关键字替换成了stu。

当然,也可以这样使用:

struct stu stu1;

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

方法五:

使用定义的结构体时,省略该结构体的第一个别名stu,直接在末尾添加STU。 使用方法同上。

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

方法六:

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

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

上述定义被视为语法知识。 如果你还是不明白,请再看一遍。

4.结构尺寸计算

相信很多人不了解结构的尺寸。 实际编程中很多地方也用到了它。 例如,在存储和复制结构体时,就会涉及到结构体的大小。

1. 比较两种结构的尺寸。 它们是一样的吗?

结构1:

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

结构2:

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

答案是不同的。 程序测试显示(stu1)=6,(stu2)=4。

2、分析差异的原因

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

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

2)结构体每个成员相对于结构体首地址的()是成员大小的整数倍。 如果有必要,编译器会在成员之间添加填充字节;

3)结构总尺寸为结构最宽基本型构件尺寸的整数倍。 如果有必要,编译器会在最后一个成员之后添加填充字节;

对于上述结构体stu1,最大字节为:2字节,顺序为char->short->char:

linux下fread_linux fread读出结构体_linux读写结构体数据

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码