《嵌入式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;

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

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

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

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

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

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

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

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

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
1211 2
|
数据采集 监控 网络协议
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
1491 40
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
|
10月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
452 15
|
运维 监控 网络协议
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
405 11
物联网设备状态监控全解析:从告警参数到静默管理的深度指南-优雅草卓伊凡
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
807 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
1255 14
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1869 13
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
726 8
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
4059 6
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
596 6

相关产品

  • 物联网平台