变量存储重温及在Ubuntu系统和Keil中编程验证
本文要使用到的软件:Ubuntu(X86)、Keil MDK、串口调试助手
本文要使用到硬件:STMF103C8T6、USB转串口、杜邦线若干、LED灯
目录
- 一、变量存储重温
- 1.1 栈
- 1.2 堆
- 1.3全局区(静态区)
- 1.4文字常量区
- 1.5程序代码区
- 二、STM32内存分配
- 2.1 ROM,Read-Only Memory
- 2.2 RAM,Random-Access Memory
- 三、编程验证
- 3.1 Ubuntu下验证存储
- 3.2 Keil下验证
- 四、总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、变量存储重温
一般来说C/C++程序占用的内存分为以下几个部分:
1.1 栈
基本内容
栈区由编译器
自动分配释放
,操作系统自动管理,不需要程序员手动管理。栈区中的内容只
在函数范围内存在
,当函数运行结束时,这些内容自动被系统销毁
。栈区按内存地址
由高到低
方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。栈区是
先进后出
原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。栈区与数据结构中的栈是两回事,注意
区分
。
包含内容
- 函数的
返回地址
和参数
临时变量
:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
特点
- 栈内存就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是
快捷
,但是自由度小
。
1.2 堆
主要内容
- 堆区,一般
由程序员分配释放
,若程序员不释放,程序结束时可能由OS回收。注意,它与数据结构中的堆是两回事。 - 堆区按内存地址
由低到高
方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
特点
- 使用堆内存就象是自己动手做喜欢吃的菜肴,比较
麻烦
,但是比较符合自己的口味,而且自由度大
。
重要函数
获得堆内存:malloc()
动态分配堆内存
原型:extern void *malloc( unsigned int num_bytes)
功能:分配长度为num_bytes
字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()
函数将内存块释放
。
malloc的语法是:指针名=(数据类型*)malloc(长度)
,(数据类型*)表示指针.
1.3全局区(静态区)
主要内容
- 通常是用于那些在编译期间就能
确定存储大小的变量
的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量
。 - 全局区有
.bss段
和.data段
组成,可读可写。
.bss段
未初始化
的全局变量
和未初始化的静态变量
存放在.bss段。初始化为0
的全局变量
和初始化为0的静态变量
存放在.bss段。- .bss段
不占用
可执行文件空间
,其内容由操作系统
初始化。
.data段
已初始化
的全局变量
和静态变量
存放在.data段。- .data段
占用
可执行文件空间
,其内容由程序
初始化
1.4文字常量区
字符串、数字
等常量存放在常量区。const
修饰的全局变量
存放在常量区。- 程序运行期间,常量区的内容
不可以被修改
。
1.5程序代码区
- 程序执行代码存放在代码区,其值
不能修改
(若修改则会出现错误)。 字符串常量
和define定义的常量
也有可能存放在代码区。
二、STM32内存分配
2.1 ROM,Read-Only Memory
基本介绍
只读存储器
ROM,只能读出
而不能写入
信息,ROM所存数据通常是装入整机前写入的,信息一旦被写入就固定下来,所有又叫做固定存储器
。
特点
- ROM只能读出不能写入信息,通常在我们的ROM里
固化
一个基本输入/输出系统,称为“BIOS(基本输入输出系统)”。完成对各功能模块的初始系统输入/输出的驱动程序。 - 由于
断电后数据不丢失
,所以ROM一般作为固件
,存放硬件的驱动程序
。
区域地址
- 从0x8000000,大小为0x10000,该片为只读区域,存放
代码区和常量区
。
2.2 RAM,Random-Access Memory
基本介绍
随机存取存储器
,也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写
,速度很快,作为操作系统或其他运行中的程序的临时数据存储介质。
特点
- 容易丢失
它与RAM最大的区别是数据的易失性
,当断电时,不能存储
数据。 - 访问速度快
随机存取存储器是所有访问设备写入和读取速度最快
的。 - 随机存取
当需要读取或写入数据时,所需时间与信息所在位置无关
,若顺序访问
时,所需时间与位置有关
。主要用来存放操作系统、应用程序、数据。
区域地址
- 从0x20000000开始,大小为0x5000,该片区域时可读写区域,存放的是
全局(静态)区、堆区和栈区
。
三、编程验证
编写程序
#include<stdio.h> //printf函数
#include<stdlib.h> //用于分配堆区
#include<string.h> //用于字符串处理//全局变量
int undef_x;//未初始化的全局变量
int def_global_x=1;//初始化的全局变量
static int undef_y;//未初始化的静态变量
static int def_global_y=2;//初始化的静态变量//常量区
const int undef_z;//const(只读)修饰未初始化全局变量
const int def_global_z=3;//const修饰初始化全局变量int main()
{//栈区int undef_lila;//未初始化的局部变量int def_lila=4;//初始化的局部变量char def_lilgroup[10]="isyuuun";//初始化的局部数组const int undef_lilc;//未初始化的局部只读变量const int def_lilc=5;//初始化的局部只读变量//堆区int *p1=malloc(4);int *p2=malloc(4);//全局区static int undef_lilb;//未初始化的局部静态变量static int def_lilb=6;//初始化的局部静态变量//常量区char *var1="63190703";char *var2="cqjtu";//输出函数printf("\n*****栈区-变量地址*****\n");printf("未初始化局部变量 :0x%p\r\n",&undef_lila);printf("已初始化局部变量 :0x%p\r\n",&def_lila);printf("已初始化局部数组 :0x%p\r\n",def_lilgroup);printf("未初始化局部只读变量 :0x%p\r\n",&undef_lilc);printf("已初始化局部只读变量 :0x%p\r\n",&def_lilc);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",&undef_x);printf("未初始化静态变量 :0x%p\r\n",&undef_y);printf("未初始化只读变量 :0x%p\r\n",&undef_z);printf("已初始化全局变量 :0x%p\r\n",&def_global_x);printf("已初始化静态变量 :0x%p\r\n",&def_global_y);printf("未初始化局部静态变量 :0x%p\r\n",&undef_lilb);printf("已初始化局部静态变量 :0x%p\r\n",&def_lilb); printf("\n*****常量区地址*****\n");printf("已初始化只读变量 :0x%p\r\n",&def_global_z);printf("已初始化局部指针变量 :0x%p\r\n",var1 );printf("已初始化局部指针变量 :0x%p\r\n",var2 );printf("\n*****代码区地址*****\n");printf("程序代码区main函数入口地址 :0x%p\n", main);free(p1);free(p2);}
3.1 Ubuntu下验证存储
- Ubuntu具体编程步骤可看我另一篇博客:点这里
- 运行后的结果如下图
- 分析
观察栈区:地址由上到下逐渐增大
观察堆区:地址由上到下逐渐增大
代码区往上每个区相对下面的区地址逐渐增大
栈区相对整体地址最大
3.2 Keil下验证
我们首先生成.HEX文件烧录到STM32F103C8T6芯片中,利用串口传输信息。
工程文件及程序
烧录成功
- 分析
栈区:从上到下依次减小
堆区:从上到下依次增大
代码区往上每个区相对下面的区地址逐渐增大
栈区相对整体地址最大
符合存储器规律。
四、总结
回顾熟悉内存变量的存储内容以及其相应的特点后,对于我们定义好的变量会有更深刻的理解,内存每个区域的地址值的划分也需要我们了解。
参考文章:
内存分配介绍:https://blog.csdn.net/MQ0522/article/details/114823770
RAM、ROM区别:https://www.php.cn/faq/465507.html
对printf函数重定义:https://blog.csdn.net/sehanlingfeng/article/details/80383117
变量存储重温及在Ubuntu系统和Keil中编程验证相关推荐
- 变量存储重温与Clion编辑器的学习与实践
变量存储重温与Clion编辑器的学习与实践 一.实验要求 二.变量存储重温 1.内存分配 (1)内存属性简述 (2)内存分区简述 (3)分区进行对比 (4)STM32数据存储位置 2.编程进行验证 ( ...
- 实现ubuntu系统和windows系统进行文件共享、互传等操作**
实现ubuntu系统和windows系统进行文件共享.互传等操作 当我们在Windows中安装了虚拟机VMware,并且在虚拟机中安装了ubuntu后.我们在实际开发过程中一般是在Windows中编辑 ...
- amd和英伟达运行linux,AMD Ryzen平台与P106 矿卡安装Ubuntu系统和CUDA环境
1.硬件环境 CPU:AMD Ryzen 3 2200G 主板:MSI A320M PRO M2 显卡:ZOTAC P106-90 3GB 内存:GSkill Aegis DDR4 2666 8GB ...
- ubuntu系统和ROS系统的版本对应关系
- 64位java_树莓派3B+安装64位ubuntu系统和docker工具
想在树莓派3B上安装一些64位应用(例如64位JDK),因此首先要安装64位的操作系统,今天咱们就一起来实战:
- [Uncaught Error: Class 'mysqli' not found]Ubuntu系统和window系统下用MYSQLi方式不能连接数据库
目录 window下 Linux下 window下 不知道是不是php版本高的原因,哎,搞了挺久的,最开始在window上,就出现了这个问题~ [Uncaught Error: Class 'mysq ...
- 浅析操作系统和Netty中的零拷贝机制
点击关注公众号,Java干货及时送达 零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的.零拷贝机制是一种 ...
- 基于Ubuntu(x86)系统和STM32(Keil)编写C程序分别进行编程、验证
文章目录 实验内容 一.基本概念 (一).全局变量 (二).局部变量 (三).堆和栈 二.编程验证 (一).基于Ubuntu用Linux系统编写C程序 (二).基于STM32用Keil编写C程序 三. ...
- Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的重温
一.C程序的内存分配 1.栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) 一般由程序员分配释放,若程序员不释放,程序 ...
最新文章
- 04.微博消息的语言检测
- 华为光猫鉴权解密逆向
- Shadow Brokers扬言兜售新漏洞攻击工具
- 分布式监控系统开发【day37】:需求讨论(一)
- 使用Laravel Eloquent ORM 时如何查询表中指定的字段
- 数值优化(Numerical Optimization)学习系列-目录
- ClassNotFoundException Com Sun Jersey Spi Container Servle
- 计算机组成原理pd指令是什么,计算机组成原理期中考试(DOC).doc
- python wmi antivirusproduct_使用python的wmi进行远程连接的时候报错
- python培训多久能入职_Python学到什么程度可以面试工作?
- python查看继承方法(一分钟读懂)
- mysql企业版安装_mysql企业版怎么安装图解
- 小程序毕设作品之微信小程序点餐系统毕业设计(4)开题报告
- CTFhub—弱密码(web)
- 游戏测试基础:适配性测试
- 在文档类中控制舞台上影片剪辑
- cmd 控制台 提示:请求的操作需要提升!
- 弹性布局(骰子六个面制作)
- 哈尔滨工业大学提出光学设计新思路:基于快速可微光线追迹的端到端单透镜成像系统设计
- 6.10力扣 10号出去逛街了,11号补上! 打印n位数
热门文章
- cpp+数据结构+设计模式
- [摘录]第一部分 掌舵领航(2)
- 概率论例题01:设P(A)=a,P(B)=b,P(A∪B)=c,则P(A非B)=()
- 12款好用的Visual Studio插件,最后一款良心推荐
- html里 f00是什么颜色,html 颜色对照表
- 蘑菇街暑期实习生一面面经 大三
- Android/Java中okhttp用法介绍
- 全网最详细最基础的网络安全入门教程
- mysql 创建表 create table详解
- 央行930新政启动房贷证券化 将撬动10万亿进楼市