在ubuntu系统中编程C语言程序里全局变量、局部变量、堆、栈,并用stm32验证

本文探讨了STM32系统中堆、栈、全局变量的内存分配,以及C程序中不同类型变量的地址空间。通过Ubuntu环境编写代码并结合STM32进行验证,展示了栈地址向下增长、堆地址向上增长、全局变量地址向上增长的规律。
摘要由CSDN通过智能技术生成


stm32的堆、栈、全局变量的分配地址编程显示

在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着data段。

1、寄存器与固件库的差异:

固件库就是函数的集合。
当我们写代码的时候可以直接对寄存器进行操作,但是如果使用的寄存器较多我们就需要掌握每一个寄存器的操作方法,对于我们而言十分的不容易,因此便有了固件库的出现。它将每个寄存器的操作封装在一个函数中,在使用的时候我们直接调用这个函数就可以了,函数固件库函数的作用是向下负责与寄存器直接打交道。向上提供用户函数调用的接口(API)。我们就不用再细究这个寄存器具体是怎么操作的。
2、C语言程序中内存分配详解
在这里插入图片描述
在这里插入图片描述
分析上图
1)、栈区(stack)
临时创建的局部变量存放在栈区。
函数调用时,其入口参数存放在栈区。
函数返回时,其返回值存放在栈区。
const定义的局部变量存放在栈区。
2)、堆区(heap)
堆区用于存放程序运行中被动态分布的内存段,可增可减。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
3)、全局区(静态区)
全局区有.bss段和.data段组成,可读可写。
4)、.bss段
未初始化的全局变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容有操作系统初始化。
5)、.data段
已经初始化的全局变量存放在.data段。
静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
const定义的全局变量存放在.rodata段。
6)、常量区
字符串存放在常量区。
常量区的内容不可以被修改。
7)、代码区
程序执行代码存放在代码区。
字符串常量也有可能存放在代码区

3、函数的栈帧
函数调用时所建立的栈帧包含下面的信息:
1)函数的返回地址。返回地址是存放在主调函数的栈帧还是被调用函数的栈帧里,取决于不同系统的实现;
2)主调函数的栈帧信息, 即栈顶和栈底;
3)为函数的局部变量分配的栈空间;
4)为被调用函数的参数分配的空间取决于不同系统的实现。

C程序代码各种类型变量的地址空间

在ubantu中编写代码如下:

#include <stdio.h>
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{
      static int m1=2, m2;
    int i = 1;
    char *p;
    char str[10] = "hello";
    char *var1 = "123456";
    char *var2 = "abcdef";
    int *p1=malloc(4);
    int 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值