C语言:内存分配---栈区、堆区、全局区、常量区和代码区

一、C语言内存分区

C语言内存分区示意图如下:
在这里插入图片描述

1. 栈区

栈区介绍
  • 栈区由编译器自动分配释放,由操作系统自动管理,无须手动管理。
  • 栈区上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁
  • 栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
  • 栈区先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。
存放内容
  • 临时创建的局部变量const定义的局部变量存放在栈区
  • 函数调用和返回时,其入口参数返回值存放在栈区

2. 堆区

堆区介绍
  • 堆区由程序员分配内存和释放。
  • 堆区按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
调用函数
  • malloc等函数实现动态分布内存。

    void *malloc(size_t);
    
    • 1

    参数size_t是分配的字节大小。
    返回值是一个void*型的指针,该指针指向分配空间的首地址。
    (void *型指针可以任意转换为其他类型的指针)

  • free函数进行内存释放,否则会造成内存泄漏。

    void free(void * /*ptr*/);
    
    • 1

    参数是开辟的内存的首地址。

3. 全局(静态)区

全局(静态)区介绍
  • 通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。
  • 全局区有 .bss段 和 .data段组成,可读可写。
.bss段
  • 未初始化的全局变量和未初始化的静态变量存放在.bss段。
  • 初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
  • .bss段不占用可执行文件空间,其内容由操作系统初始化。
.data段
  • 已初始化的全局变量存放在.data段。
  • 已初始化的静态变量存放在.data段。
  • .data段占用可执行文件空间,其内容有程序初始化。

4. 常量区

  • 字符串数字等常量存放在常量区。
  • const修饰的全局变量存放在常量区。
  • 程序运行期间,常量区的内容不可以被修改。

5. 代码区

  • 程序执行代码存放在代码区,其值不能修改(若修改则会出现错误)。
  • 字符串常量和define定义的常量也有可能存放在代码区。

二、STM32存储器分配

1. 随机存储器—RAM

  • RAM是与CPU直接交换数据的内部存储器,也叫主存(内存)。
  • 它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
  • 当电源关闭时RAM不能保留数据(掉电数据消失哦)如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。

2. 只读存储器—ROM

  • ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。
  • ROM所存数据稳定,断电后所存数据也不会改变。

本文使用是STM32F103芯片,keil V5环境下默认的内存配置见下图:
在这里插入图片描述

  • ROM区域是0x8000000开始,大小是0x10000,这片区域是只读区域,不可修改,存放代码区常量区
  • RAM区域是0x20000000开始,大小是0x5000,这片区域是可读写区域,存放的是全局(静态)区堆区栈区

该芯片的内部分区如下图所示:
在这里插入图片描述

三、基于STM32代码验证

1. 详细代码如下

#include "main.h"
#include <string.h> //用于字符串处理
#include <stdio.h>	//用于printf打印
#include <stdlib.h> //用于分配堆区---调用malloc和free#include "delay.h"
#include "uart3.h"
#include "led.h"//全局区int 	q1;		//未初始化全局变量
static 	int 	q2;		//未初始化静态变量	
const  	int   	q3;		//未初始化只读变量		int   m1=1;		//已初始化全局变量
static  int   m2=2;		//已初始化静态变量//常量区
const   int   m3=3;		//已初始化只读变量int main(void)
{SystemCoreClockUpdate(); //设置系统时钟为72MLED_GPIO_Config();Uart3_init();while(1){//栈区	int 	 mq1;			//未初始化局部变量int  	*mq2;			//未初始化局部指针变量int   	mq3=3;		//已初始化局部变量	char 	qq[10] = "hello"; //已初始化局部数组const  	int   mq4;			//未初始化局部只读变量const   int   mq5=3;		//已初始化局部只读变量//堆区int *p1 = malloc(4);    //已初始化局部指针变量p1int *p2 = malloc(4);    //已初始化局部指针变量p2		//全局区static 	int 	mp1;			//未初始化局部静态变量	static  int   mp2=2;		//已初始化局部静态变量//常量区char *vv = "I LOVE YOU";//已初始化局部指针变量char *mq = "5201314";printf("\n栈区-变量地址\n");printf("未初始化局部变量 		:0x%p\r\n",&mq1);printf("未初始化局部指针变量		:0x%p\r\n",&mq2);printf("已初始化局部变量			:0x%p\r\n",&mq3);printf("已初始化局部数组			:0x%p\r\n", qq );printf("未初始化局部只读变量 		:0x%p\r\n",&mq4);printf("已初始化局部只读变量		:0x%p\r\n",&mq5);printf("\n堆区-动态申请地址\r\n");printf("已初始化局部int型指针变量p1   :0x%p\r\n", p1);printf("已初始化局部int型指针变量p2   :0x%p\r\n", p2);printf("\n全局区-变量地址\n");printf("未初始化全局变量 	:0x%p\r\n",&q1);printf("未初始化静态变量		:0x%p\r\n",&q2);printf("未初始化只读变量		:0x%p\r\n",&q3);printf("已初始化全局变量 	:0x%p\r\n",&m1);printf("已初始化静态变量		:0x%p\r\n",&m2);printf("未初始化局部静态变量	 :0x%p\r\n",&mp1);printf("已初始化局部静态变量	 :0x%p\r\n",&mp2);			printf("\n常量区地址\n");printf("已初始化只读变量		  :0x%p\r\n",&m3);printf("已初始化局部指针变量	  :0x%p\r\n",vv );printf("已初始化局部指针变量	  :0x%p\r\n",mq );printf("\n代码区地址\n");printf("程序代码区main函数入口地址	:0x%p\n", main);led485_flicker();delay_ms(1000);free(p1);free(p2);        }
}

2. 运行结果如下

栈区-变量地址
未初始化局部变量 		:0x20000654
未初始化局部指针变量		:0x20000650
已初始化局部变量			:0x2000064c
已初始化局部数组			:0x20000640
未初始化局部只读变量		:0x2000063c
已初始化局部只读变量		:0x20000638堆区-动态申请地址
已初始化局部指针变量p1   	:0x20000060
已初始化局部指针变量p2   	:0x20000068全局区-变量地址
未初始化全局变量 		:0x20000014
未初始化静态变量			:0x20000018
未初始化只读变量		 	:0x2000001c
已初始化全局变量 	 	:0x20000020
已初始化静态变量		 	:0x20000024
未初始化局部静态变量	 	:0x20000028
已初始化局部静态变量	 	:0x2000002c常量区地址
已初始化全局只读变量	  	:0x080011a4
已初始化局部指针变量	  	:0x08000e78
已初始化局部指针变量	  	:0x08000e84代码区地址
程序代码区main函数入口地址	:0x08000d6d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas Dataframe 的学习笔记

Pandas Dataframe 的学习笔记 0. Pandas 简介1. 为什么要用 Pandas&#xff1f;2. Series3. DataFrame3-1. 创建 DataFrame3-2. 选择数据3-3. 数据过滤3-4. 修改 DataFrame3-5. 数据清洗3-6. 数据合并3-7. info()3-8. head()3-9. tail()3-10. fillna() 0. Pandas 简介 想象一下…

C# 随机打乱数组

Fisher-Yates 洗牌算法是一种高效地将有限序列的元素进行随机洗牌的算法。这个算法在本地进行&#xff0c;不需要额外的内存开销。其基本思想是从最后一个元素开始&#xff0c;每次从未被选中的元素中随机选择一个与当前位置的元素交换&#xff0c;直到到达序列的开始。 这个算…

数据分析 — Pandas 数据处理

目录 一、简介1、概念2、特点3、引用 二、数据结构1、Series2、DataFrame 三、常见操作1、数据合并2、数据删除3、创建多层索引4、数据对齐5、排序6、DataFrame 和 Series 之间的运算 四、应用 一、简介 1、概念 Pandas&#xff08;Python Data Analysis Library&#xff09;…

前端秘法进阶篇之事件循环

目录 一.浏览器的进程模型 1.进程 2.线程 二.浏览器的进程和线程 1. 浏览器进程 2. 网络进程 3. 渲染进程 三.渲染主线程 四.异步 五.优先级 1. 延时队列&#xff1a; 2.交互队列&#xff1a; 3.微队列&#xff1a; 六.JS 的事件循环 附加:JS 中的计时器能做到精…

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

性能测试监控指标及分析调优

目录 一、哪些因素会成为系统的瓶颈&#xff1f; 1.1 CPU 1.2 内存 1.3 磁盘 I/O 1.4 网络 1.5 数据库 二、哪些指标做为衡量系统的性能 2.1 TPS 吞吐量 2.1.1 磁盘吞吐量 2.1.2 网络吞吐量 2.2 资源使用率 2.2.1 CPU 使用率 2.2.2 内存使用率 2.2.3 磁盘 I/O …

10.什么是 JavaScript 中的包装类型

在 JavaScript 中&#xff0c;基本类型是没有属性和方法的&#xff0c;但是为了便于操作基本类型的值&#xff0c;在调用基本类型的属性或方法时 JavaScript 会在后台隐式地将基本类型的值转换为对象&#xff0c;如&#xff1a; const a "abc"; a.length; // 3 a.t…

open ai api 国内配置代理指南(网上最全)

1.配置须知 open ai 作为这一波AI浪潮的推动者&#xff0c;opne ai的gpt 系列产品在使用和体验上绝对是最强大的&#xff0c;现在对于开发者来说要在代码中访问open ai api是不可用的。所以本文就主要解决这个问题。我们要了解open ai 的网站gpt的访问和api的访问收费是分开来…

配置Juniper虚墙vSRX基于策略的IPsec VPN(WEB方式)

正文共&#xff1a;1444 字 18 图&#xff0c;预估阅读时间&#xff1a;2 分钟 关于IPsec VPN&#xff0c;我们已经有一个合集了&#xff08;IPsec VPN&#xff09;。之前接触比较多的是H3C的IPsec VPN&#xff0c;后来接触的厂家多了&#xff0c;才发现大家的模型或者叫法还是…

数据卷的常见命令,如何创建Nginx容器,修改nginx容器内的html目录下的index.html文件

数据卷 什么是数据卷 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机**目录**之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源 conf&#xff1a;放置配置文…

文心一言4.0 VS ChatGPT4.0哪家强?!每月60块的文心一言4.0值得开吗?

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Python在手机芯片

Python在手机芯片的智能化芯片研发开发中具有重要性。首先&#xff0c;Python作为一种高级编程语言&#xff0c;具有简洁、易读、易写的特点&#xff0c;使得芯片开发人员能够更加快速地编写和调试代码。这对于芯片研发过程中的迭代和优化至关重要。 其次&#xff0c;Python拥…

微服务设计:Spring Cloud 链路追踪概述

Spring Cloud 链路追踪是指在分布式系统中追踪请求路径的技术。它可以帮助开发者了解请求在各个微服务之间是如何流转的&#xff0c;以及每个微服务处理请求所花费的时间。链路追踪可以用于解决以下问题&#xff1a; 性能分析: 识别性能瓶颈&#xff0c;优化微服务性能。故障排…

AI短视频一键换脸小程序源码/带流量主

微信云开发AI一键视频换脸小程序源码是由极客二改后发布的&#xff0c;小程序增加了广告控制&#xff0c;插屏广告&#xff0c;激励广告和原生广告&#xff0c;由于采用了微信云开发没有后台&#xff0c;所以不需要域名和服务器也可以正常搭建使用&#xff0c;所有的配置都可以…

C++,stl,函数对象,谓词,内建函数对象

目录 1.函数对象使用 2.谓词 1.一元谓词 2.二元谓词 3.内建函数对象 1.算术仿函数 2.关系仿函数 3.逻辑仿函数 1.函数对象使用 #include<bits/stdc.h> using namespace std;class add { public:int operator()(int v1,int v2){return v1 v2;} };class print { p…

comfyui视频转绘学习笔记

算法方案 ComfyUIAnimateDiffcontrolnet 目录 依赖项&#xff1a; 楚门的ai世界 森森star AI_空杯心_47 依赖项&#xff1a; AnimateDiff for ComfyUI 需要去github下载模型 ComfyUI-Impact-Pack git clone https://github.com/ltdrdata/ComfyUI-Impact-Pack.git htt…

【Java中文乱码浅析及解决方案——详细讲解】

Java中文乱码浅析及解决方案 1. 介绍2. 原因分析3. 解决方案4. 环境配置5. 测试 1. 介绍 Java中文乱码通常发生在字符串在不同编码之间转换时&#xff0c;导致编码与解码使用的字符集不一致&#xff0c;或者是平台默认编码与数据的实际编码不一致&#xff0c;这可能在文件读写…

MyBatis之Like模糊查询的两种实现方式

MyBatis之Like模糊查询的两种方式 文章目录 MyBatis之Like模糊查询的两种方式1. Mybatis中Like模糊查询1. 传递参数值时直接拼接%%2. Mapper.xml中绑定标签 1. Mybatis中Like模糊查询 有两种方式&#xff1a; 在Java代码中传递参数值时直接拼接 %%mapper.xml中利用数据库内置拼…

从C向C++8——多态

一.多态基础 面向对象程序设计语言有封装、继承和多态三种机制&#xff0c;这三种机制能够有效提高程序的可读性、可扩充性和可重用性。 “多态&#xff08;polymorphism&#xff09;”指的是同一名字的事物可以完成不同的功能。多态可以分为编译时的多态和运行时的多态。前者主…

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…