【嵌入式学习2】内存管理
## C语言编译过程
- 预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法,将#include #define这些头文件内容插入到源码中
gcc -E main.c -o main.i
- 编译:检查语法,将预处理后文件编译生成汇编文件,将预处理阶段的源代码转换为汇编语言
gcc -S main.i -o main.s
- 汇编:将汇编文件生成目标文件(二进制文件),将汇编语言转换为机器代码生成目标文件
gcc -c main.s -o main.o
- 链接:将目标文件链接为可执行程序,将多个目标文件和库文件链接在一起
gcc main.o -o main
## 进程的内存分布
- 程序运行起来(没有结束前)就是一个进程
- 对于C语言而言,内存空间主要由五个部分组成:代码区(text)、数据区(data)、未初始化数据区(bss),堆(heap) 和 栈(stack) ,有些人会把data和bss合起来叫做静态区或全局区

| 区域 | 加载内容 | 注意 |
| 代码区 | 可执行文件代码段 | 这块内存是不可以在运行期间修改的 |
| 未初始化数据区 | 可执行文件BSS段 | 存储在该区的数据生存周期为整个程序运行过程 |
| 全局初始化数据区/静态数据区 | 可执行文件数据段 | 存储在该区的数据生存周期为整个程序运行过程 |
| 堆区 | 动态内存分配,位于BSS和栈之间 | 由程序员分配和释放,程序员不释放程序结束时由操作系统回收 |
| 栈区 | 函数的参数值、返回值、局部变量等 | 由编译器自动分配释放,在程序运行过程中实时加载和释放 |
## 堆区内存使用
1、malloc
#include <stdlib.h>
void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定。
参数:size:需要分配内存大小(单位:字节)
返回值:成功:分配空间的起始地址失败:NULL
2、free
#include <stdlib.h>
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
参数:ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无
例子:
#include <stdlib.h>
#include <stdio.h>int main() {int i, *arr, n;printf("请输入要申请数组的个数: ");scanf("%d", &n);// 堆区申请 n * sizeof(int) 空间,等价int arr[n]arr = (int *)malloc(n * sizeof(int));if (arr == NULL) { // 如果申请失败,提前中断函数printf("申请空间失败!\n");return -1;}for (i = 0; i < n; i++){// 给数组赋值arr[i] = i;}for (i = 0; i < n; i++) {// 输出数组每个元素的值printf("%d, ", *(arr+i));}// 释放堆区空间free(arr);return 0;
}
## 内存分布代码分析
| 类型 | 存储位置 | 生命周期 | 初始值 |
| 普通局部变量 | 栈区 | 函数执行完毕后销毁 | 每次函数调用都会被初始化初始值不确定 |
| 静态局部变量 | 静态存储区 | 整个程序运行时间,函数运行结束仍保留 | 第一次函数调用时被初始化直到程序结束 |
#include <stdio.h>void normal_func() {int i = 0;i++;printf("局部变量 i = %d\n", i);
}void static_func() {static int j = 0;j++;printf("static局部变量 j = %d\n", j);
}int main() {// 调用3次normal_func()normal_func();normal_func();normal_func();// 调用3次static_func()static_func();static_func();static_func();return 0;
}
运行结果:
局部变量 i = 1
局部变量 i = 1
局部变量 i = 1
static局部变量 j = 1
static局部变量 j = 2
static局部变量 j = 3
返回堆区地址:
#include <stdio.h>
#include <stdlib.h>int *func() {int *tmp = NULL;// 堆区申请空间tmp = (int *)malloc(sizeof(int));*tmp = 100;return tmp; // 返回堆区地址,函数调用完毕,不释放
}int main() {int *p = NULL;p = func();printf("*p = %d\n", *p); // ok// 堆区空间,使用完毕,手动释放if (p != NULL) {free(p);p = NULL;}return 0;
}
- 在
func函数中,通过malloc在堆区动态分配了一个int类型的内存空间,并将其地址赋值给指针tmp。 - 将值
100存储到分配的内存中。 - 返回指向堆区内存的指针
tmp。由于堆区内存是在程序运行时动态分配的,它不会在函数返回时自动释放,因此返回的指针是有效的
- 在
main函数中,调用func函数并将返回的指针赋值给p。 - 通过
printf输出*p的值,此时*p指向的内存是有效的,因此可以正常输出100。 - 使用
free函数释放动态分配的内存,避免内存泄漏。 - 将
p设置为NULL,这是一个良好的编程习惯,可以避免后续误用已释放的指针。
## 如何修复野指针
错误代码:
#include <stdio.h>int main() {int *ptr;int num = 10;*ptr = num;printf("Value: %d\n", *ptr);return 0;
}
修改代码:
#include <stdio.h>int main() {int *ptr = NULL;int num = 10;ptr = #printf("Value: %d\n", *ptr);return 0;
}
## 接受一个整数作为参数,计算并返回它的阶乘值
void hanshu(int a)
{ int sum = 1;while(a){sum *= a;a--;}printf("a的阶乘是: %d",sum);
}
int main()
{int a;printf("请输入一个整数:");scanf("%d",&a);hanshu(a);return 0;
}
## 定义一个整型变量和一个指向该变量的指针,并将指针指向变量的地址,通过2种方式打印整型变量的内容
int main() {
int a =250;
int* p1 = &a;
printf("a-address: %p\n",&a);
printf("a-address: %p\n",p1);return 0;
}
## 定义一个整型变量,初始值为100,通过某个函数修改改变量的内容为123
#include <stdio.h>void func(int* p){*p = 123;
}int main() {int a = 100;printf("a = %d\n",a);func(&a);printf("a = %d\n",a);
return 0;
}相关文章:
【嵌入式学习2】内存管理
## C语言编译过程 预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法,将#include #define这些头文件内容插入到源码中 gcc -E main.c -o main.i 编译:检查语法,将预处理后文件编译生成汇编文件ÿ…...
密码学(Public-Key Cryptography and Discrete Logarithms)
Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念:离散对数是密码学中一个重要的数学问题,特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说,给定一个群 G G G和一个生成元 …...
TDengine又新增一可视化工具 Perspective
概述 Perspective 是一款开源且强大的数据可视化库,由 Prospective.co 开发,运用 WebAssembly 和 Web Workers 技术,在 Web 应用中实现交互式实时数据分析,能在浏览器端提供高性能可视化能力。借助它,开发者可构建实时…...
【Linux文件IO】Linux中标准IO的API的描述和基本用法
Linux中标准IO的API的描述和基本用法 一、标准IO相关API1、文件的打开和关闭示例代码: 2、文件的读写示例代码:用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝) 3、文件偏移设置示例代码: 4、fgets fputs fget…...
深度学习篇---PaddleDetectionPaddleOCR
文章目录 前言1.代码2.代码介绍2.1 **导入模块**2.2 **配置区域**2.3 ExpressInfoProcessor类2.4 **主程序**: 3.使用说明3.1环境准备3.2模型准备3.3数据库初始化3.4串口配置3.5信息提取优化3.6注意事项 前言 本文简单介绍了PaddleDetection和PaddleOCR相结合的示例…...
Ant Design Vue Select 选择器 全选 功能
Vue.js的组件库Ant Design Vue Select 选择器没有全选功能,如下图所示: 在项目中,我们自己实现了全选和清空功能,如下所示: 代码如下所示: <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …...
系统与网络安全------网络应用基础(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…...
ZIP_STORED和ZIP_LZMA没有compresslevel参数!
在使用py的zipfile库进行压缩的时候,有这么一个函数: def write(self, filename, arcnameNone,compress_typeNone, compresslevelNone): 一般我们在压缩文件进去的时候都是用这个函数的; 对于compresslevel这个函数,它是用来指…...
坦克大战(c++)
今天我给大家分享一个c游戏。 废话不多说,作品展示: #include <stdio.h> #include <windows.h> #include <time.h> //里规格:长39*278 (真坐标)(假坐标宽为39) 高39 //外规格:长…...
论文阅读:2023 EMNLP SeqXGPT: Sentence-level AI-generated text detection
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 SeqXGPT: Sentence-level AI-generated text detection https://aclanthology.org/2023.emnlp-main.73/ https://github.com/Jihuai-wpy/SeqXGPT https://www.doubao.com/chat/21003…...
JDK 24 发布,新特性解读!
一、版本演进与技术格局新动向 北京时间3月20日,Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本,其技术革新力度远超预期——共集成24项JEP提案,相当于Java 22(12项)与Java 23(12项&#…...
k8s中service概述(二)NodePort
NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明࿱…...
Oracle归档配置及检查
配置归档位置到 USE_DB_RECOVERY_FILE_DEST,并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…...
计算机二级:函数基础题
函数基础题 第一题 rinput("请输入半径:") c3.1415926*r*2 print("{:.0f}".format(c))输出: Type Error第二题 a7 b2 print(a%2)输出 1第三题 ab4 def my_ab(ab,xy):abpow(ab,xy)print(ab,end"\n") my_ab(ab,2)prin…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
AI 时代,我们需要什么样的数据库?
AI 时代,我们需要什么样的数据库? 人工智能正在悄然改变软件开发的方式。过去一年间,诸如 GitHub Spark、Replit 和 Bolt 等新兴 AI 工具层出不穷,能够快速生成简单的前端应用,甚至无需传统意义上的后端服务就能部署上…...
刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型
在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…...
Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建
本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库,并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3:采用 Composition API 开发mxGraph:JavaScript 流程图库(版本 …...
Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法
文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在:3.如果未找到,可能是内核模块未正确生成。尝试安装 linux-modules-extra:4.再次检查 iwlwifi.ko 是否存在:5.确…...
蓝桥杯,利用 Vue.js 构建简易任务管理器
在日常开发中,我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天,我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能࿰…...
国际机构Gartner发布2025年网络安全趋势
转自:中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称,网络安全和风险管理在2025年“面临挑战与机遇并存的局面”,“实现转型和提高弹性”对确保企业在快速变化的数字世界中,实现安全且可持续的创新至关…...
【设计模式】单件模式
七、单件模式 单件(Singleton) 模式也称单例模式/单态模式,是一种创建型模式,用于创建只能产生 一个对象实例 的类。该模式比较特殊,其实现代码中没有用到设计模式中经常提起的抽象概念,而是使用了一种比较特殊的语法结构&#x…...
Elasticsearch + Docker:实现容器化部署指南
Elasticsearch是一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术,能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合,不仅可以简化部署流程࿰…...
win32汇编环境,网络编程入门之十一
;win32汇编环境,网络编程入门之十一 ;在上一教程里,我们学习了如何读取大容量的网页内容,在这一教程里,我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…...
穿越之程序员周树人的狂人日记Part3__人机共生纪元
穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点:协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】:员工生存之现状 静夜…...
后端——AOP异步日志
需求分析 在SpringBoot系统中,一般会对访问系统的请求做日志记录的需求,确保系统的安全维护以及查看接口的调用情况,可以使用AOP对controller层的接口进行增强,作日志记录。日志保存在数据库当中,为了避免影响接口的响…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
第十四章:模板实例化_《C++ Templates》notes
模板实例化 核心知识点解析多选题设计题关键点总结 核心知识点解析 两阶段查找(Two-Phase Lookup) 原理: 模板在编译时分两个阶段处理: 第一阶段(定义时):检查模板语法和非依赖名称࿰…...
循环查询指定服务器开放端口(Python)
循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…...
算法 | 蜣螂优化算法原理,引言,公式,算法改进综述,应用场景及matlab完整代码
蜣螂优化算法(Dung Beetle Optimizer, DBO)详解 1. 算法原理 蜣螂优化算法(DBO)是一种基于自然界蜣螂行为的元启发式优化算法,灵感来源于蜣螂的滚球、繁殖、觅食和偷窃行为。其核心思想是通过模拟蜣螂在复杂环境中的协作与竞争机制,解决全局优化问题。关键行为模拟: 滚球…...
