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,一经查实,立即删除!

相关文章

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

目录 一.浏览器的进程模型 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开发&…

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全维度知识…

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…

从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.…

儿童护眼台灯哪个值得推荐?推荐专业的儿童护眼台灯

现在的孩子很多都存在视力问题&#xff0c;而且年龄也越来越早&#xff0c;不少还为上学的孩子都早已戴上小眼镜。虽说这可能存在家族近视遗传的可能性&#xff0c;不过更多的还是后天导致的。长时间玩耍电子产品、缺乏运动、不良用眼习惯、不合适的光线等等都是导致孩子近视的…

【JavaScript 教程】

JavaScript 教程 JavaScript 在线实例为什么学习 JavaScript? JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都可以使用 JavaScript。 JavaScript 非常容易学。 JavaScript 在线实例 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

23款奔驰S400商务版没有后排电动座椅那改装一套跟选装有区别吗

改装的后排电动座椅通常提供以下功能&#xff1a; 电动调节&#xff1a;座椅可以通过按钮或控制面板进行前后调节&#xff0c;以适应乘客的腿部空间需求。 靠背角度调节&#xff1a;乘客可以通过电动调节功能来调整座椅的靠背角度&#xff0c;以获得更舒适的坐姿。 座椅倾斜调…

一文讲透Python函数中的形式参数和实际参数

函数参数包括形式参数和实际参数&#xff0c;简称形参和实参。其中形式参数即是在定义函数时函数后面括号中的参数列表&#xff08;parameterlist&#xff09;&#xff0c;比如上一个帖子的示例中的width, length&#xff1b;实际参数则是调用函数时函数后面括号中的参数值&…

【HTML】交友软件上照片的遮罩是如何做的

笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐&#xff0c;&#x1f436;。于是就去下了一些交友软件来排遣寂寞。可惜的是&#xff0c;有些交友软件真不够意思&#xff0c;连一些漂亮小姐姐的图片都要进行遮罩&#xff0c;完全不考虑兄弟们的感受,&#x1f620;。所…

Go教程-什么是编程?

什么是编程&#xff0c;这是个有趣的话题。 编程是什么 编程&#xff0c;字面意思即编写程序&#xff0c;即通过既定的关键字&#xff0c;来描述你的想法&#xff0c;并让计算机的各个部件按照你的想法来做事。 这里计算机的各个部件通常来说&#xff0c;指的是CPU和IO设备。…

解决Windows更新后无法启动的十种办法,总有一种适合你

你可能已经更新了操作系统以修复错误或使用最新功能。但是,如果Windows在更新后无法启动呢? 如果你面临这样的问题,主要是由于安装文件中的错误或你的系统与最新更新不兼容。此外,损坏的MBR或驱动程序也会阻止电脑启动。 不管是什么原因,本文将用十种简单的技术来指导你…

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)

算法沉淀——队列宽度优先搜索&#xff08;BFS&#xff09; 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法&#xff08;Queue BFS&#xff09;是一种常用于图的遍历的算法&#xff0c;特别适用于求解最短路径…

Ps:统计

Ps菜单&#xff1a;文件/脚本/统计 Scripts/Statistics 统计 Statistics脚本命令提供了一种高效的方法来处理和分析大量图像&#xff0c;使用户能够自动执行复杂的图像分析任务&#xff0c;并在多个图像间应用统计学方法。这个功能极大地扩展了 Photoshop 在科学研究、图像编辑…

【单总线与DS18B20总结和代码实现】

单总线介绍与总结 单总线介绍单总线时序图DS18B20的操作流程代码 读温度代码思路代码实现 单总线介绍 单总线应用案例&#xff1a;Ds18B20、温湿度传感器用到的就是这个&#xff0c;这里Ds18B20从当的角色是从机部分&#xff0c;而开发板充当的部分人是主机部分。 Ds18B20内部结…