《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.6 内存管理之结构体

简介: 本节书摘来自华章出版社《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.6节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 内存管理之结构体 1.6.1 数据结构这门学问的意义 数据结构就是研究数据如何组织(在内存中排布)、如何加工的学问。

本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.6节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.6 内存管理之结构体

1.6.1 数据结构这门学问的意义

数据结构就是研究数据如何组织(在内存中排布)、如何加工的学问。

1.6.2 最简单的数据结构:数组

为什么要有数组?因为程序中有好多个类型相同、意义相关的变量需要管理,这时候如果用单独的变量的话,会使得程序看起来比较杂乱;用数组更便于管理,而且定义简单、使用方便。

1.6.3 数组的优缺点

优点:数组定义简单,而且访问也很方便。

缺点:

数组中所有元素类型必须相同;
数组大小必须定义时给出,而且在大多数情况下,数组的空间大小一旦确定后就不能再改;
数组的空间必须是连续的,这就造成数组在内存中分配空间时必须找到一块连续的内存空间。所以数组不可能定义得太大,因为内存中不可能有那么多大的连续的内存空间,而解决这个问题的方法就是使用链表。我们这里先不讲,后面的章节会讲到。

1.6.4 结构体隆重登场

结构体发明出来就是为了解决数组的第一个缺点—数组中所有元素类型必须相同。有时候,我们在描述事物时,不得不从多个方面描述,如下面的例子。

    我们要管理3个学生的年龄(int类型),怎么办?
    第一种解法:用数组        int ages[3];
    第二种解法:用结构体    
        struct ages
        {
            int age1;
            int age2;
            int age3;
        };
        struct ages age;
AI 代码解读

在这个示例中,数组要比结构体好。但是不能说数组就一定比结构体好,如果元素类型不同时,就只能用结构体而不能用数组了。

    struct people
    {
        int age;               // 人的年龄
        char name[20];         // 人的姓名
        int height;            // 人的身高
    };
AI 代码解读

因为people的各个元素类型不完全相同,所以必须用结构体,没办法使用数组。

由上面的例子我们可以看出,结构体属于聚合数据类型,提供一种把各种相关且类型可能不同的数据组合到一起的手段。而数组是同种数据类型的集聚。结构体变量在被定义后,编译器在编译的时候会为所有成员分配空间。向函数传递结构时,实际上是传递结构成员的值,即都是值传递方式(包括用结构体变量作为函数参数以及函数返回值也是结构体变量的情况)。由此也可看出,结构体变量名代表的是整个结构体变量,而不像数组名代表地址。除了简单结构体外,向函数传递整个结构体变量存在很大的缺陷,因为当执行函数调用时,数据压栈需要开销(为什么会调用压栈,下节我们就讲)。这对于多成员结构或成员中有数组的结构,运行性能会严重恶化。解决的方案是,传递结构体变量的指针。向函数传递结构指针时,压栈的仅仅是结构体变量的地址,而使得函数调用非常快。传递结构体变量地址的另一个优点是,函数还可以修改被传递结构体变量的成员值。

1.6.5 题外话:结构体内嵌指针实现面向对象

总体来说,C语言是面向过程的,但是C语言写出的Linux系统是面向对象的。非面向对象的语言,其实也是可以使用面向对象的思想来编写程序的。只是说用面向对象的语言来实现面向对象的编程会更加简单一些,所以我们会觉得用C++、Java等面向对象语言来实现面向对象的开发更容易接受,而使用C语言来实现面向对象的开发相对不容易理解些,这就是为什么大多数人学过C语言却看不懂Linux内核代码。

    structs
    {
        int age;                  // 普通变量
        void (*pFunc)(void);      // 函数指针,指向void func(void)
                                  // 这类的函数
    };
AI 代码解读

使用这样的结构体就可以实现面向对象,这样包含了函数指针的结构体就类似于面向对象中的class,结构体中的变量类似于class中的成员变量,结构体中的函数指针类似于class中的成员方法。#

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
打赏
0
0
0
0
1811
分享
相关文章
|
2月前
|
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
51 6
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
30 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
60 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
168 14
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
204 10
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
74 6
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
222 13

物联网

+关注

相关产品

  • 物联网平台
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等