亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

掌握 C 结构中灵活的数组成员以进行动态数据处理

灵活的数组成员 用于处理结构内部的数组而不定义其大小。这些数组在运行时获取它们的大小。 结构 C 中是一种用户定义的数据类型,我们将不同数据类型的多个成员一起定义在一个名称下。

以下是语法 用于在 C 中声明结构 -

<前>01

在这里,每个成员 可以有不同的数据类型 .

灵活的数组成员 通过在其固定大小成员的末尾保存一个动态大小的数组并将所有数组一起存储在一个内存块中来扩展结构。在本章中,我们将了解它们如何在结构内部工作。

结构中灵活的数组成员

灵活的数组成员 是一个结构体中的数组,没有固定大小,其内存是在运行时使用 malloc() 动态分配的 , calloc() ,或类似的函数,并且使用空方括号 [] 声明 .

灵活数组成员 必须在结构体末尾声明,并且在声明之前必须至少有一个其他成员。

以下是声明灵活数组的语法 结构内的成员 -

<前>11

这里,data_type 是数组的数据类型,arrayName[] 是没有固定大小的灵活数组。

灵活数组成员的内存分配

灵活的数组成员 没有固定的大小,因此编译器不会在结构体内部为其分配任何内存。 sizeof 运算符 只计算结构体固定成员的大小,不包括灵活数组成员。这就是为什么我们需要手动分配内存 创建此类结构时。

所需的总内存计算如下 -

<前>28

这里,sizeof(结构) 给出固定成员的内存,以及(元素数量 x sizeof(元素类型)) 给出灵活数组的内存。将它们相加即可得出要分配的总内存。

示例 1:为灵活数组成员分配内存

下面是一个示例 其中我们定义了一个具有一个固定成员和一个灵活数组的结构体,并为灵活数组分配了内存。

<前>32

这里,sizeof(struct 示例) 给出4字节 对于id 会员。然后,我们计算灵活数组的内存:5 x sizeof(int) =20 字节 。分配的总内存为4 + 20 =24 字节输出 是 -

<前>40

示例 2:访问结构中的灵活数组

在此示例中,我们定义了一个 Student 结构 具有一个固定成员(id )和一个灵活的数组成员(marks )。我们分配内存 动态地获取灵活数组并访问其元素。如果我们访问超出分配大小的元素,将导致未定义的行为,因此我们只访问 marks[0]标记[2] .

<前>59

以下是输出 上述程序 -

<前>61

灵活数组成员的动态调整大小

可以使用realloc()函数调整灵活数组的大小 。该函数要么扩展现有内存块,要么分配新块并自动复制现有数据。

要调整灵活数组的大小,我们调用realloc()函数 使用公式计算新的总内存大小 -

<前>73 注意:始终存储realloc()函数的结果 在临时指针中。如果失败,您的原始指针仍然安全。另外,调整大小后更新大小计数器并仅初始化新添加的元素。

示例 3:动态调整灵活数组成员的大小

在此示例中,我们创建一个学生结构 保持3分 最初。稍后,我们调整灵活数组的大小以容纳 6 个标记 使用realloc() 。我们已经存储的标记保持不变,因此我们不需要手动复制它们。

<前>80

以下是输出 显示初始和调整大小的灵活数组的结构大小和总内存。

<前>90

在本章中,我们学习了C 结构中的灵活数组成员 。它们在结构体的末尾声明并处理可变长度数据、节省内存并轻松适应不同的数据大小。我们还了解了如何分配、访问和调整它们的大小。


C语言

  1. C++ 指针
  2. C++ 字符串
  3. C#中的序列化和反序列化示例
  4. 带有代码说明的 C++ 中的 Hello World 程序
  5. C# 编程中的命名空间
  6. C++ 异常处理:Try、Catch、throw 示例
  7. C++ 变量、文字和常量
  8. C++ 中的数据封装
  9. C# - 正则表达式
  10. 带有示例的 C 库中的 malloc() 函数
  11. C++ 日期和时间
  12. C++ 中断语句