C程序在 Ubuntu 和 STM32 中内存分区

本文详细介绍了C程序在内存中的分区,包括栈区、堆区、全局区、常量区和代码区,并通过Ubuntu和STM32的实际例子验证内存分配。同时,探讨了全局变量、局部变量、静态变量的特性,以及STM32的内存结构,如RAM、ROM和Flash Memory。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、程序在内存中的分区

二、全局变量和局部变量

三、STM32 的内存分配

1、STM32 中的内存分配详解

2、STM32 中的内存结构

三、Ubuntu 和 STM32 地址下输出验证实例

1、Ubuntu 下的输出验证

2、STM32 地址下的输出验证实例 

 四、总结

五、参考资料


一、程序在内存中的分区

 

1、栈区(stack)

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存.

2、堆区(heap)

一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收.类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放.

3、全局区(静态区)(static)

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放

4、文字常量区

常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区

存放函数体的二进制代码。
 

内存存放顺序 (由上到下) : 栈区 -> 堆区 -> 全局区 -> 常量区 -> 代码区

结合以下代码理解

//main.cpp
#include <iostream>
using namespace std;
#include <string.h>

int a = 0;  //全局初始化区 
char *p1;  //全局未初始化区 

int main(void)
{ 
    int b;  //栈 
	char s[] = "abc";  //"abc"在常量区,s在栈上。 
	char *p2;  //栈 
	char *p3 = (char*)"123456";  //123456\0;在常量区,p3在栈上。 
	static int c = 0;  //全局(静态)初始化区 

	p1 = (char *)malloc(10); 
	p2 = (char *)malloc(20); //分配得来的 10 和 20 字节的区域就在堆区。
 
	strcpy(p1, "123456");  //123456\0放在常量区,编译器可能会将它与 p3 所指向的"123456"优化成一个地方。 

	delete p1, p2;
	return 0;
} 

二、全局变量和局部变量

    全局变量:在整个工程文件内都有效;“在函数外定义的变量”,即从定义变量的位置到本源文件结束都有效。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值, 就能影响到其他函数中全局变量的值。
    静态全局变量:只在定义它的文件内有效,效果和全局变量一样,不过就在本文件内部;
    静态局部变量:只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;静态局部变量的生存期虽然为整个工程,但是其作用仍与局部变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。     
  局部变量:在定义它的函数内有效,但是函数返回后失效。“在函数内定义的变量”,即在一个函数内部定义的变量,只在本函数范围内有效。
 

具体请参考:C语言全局变量和局部变量(带实例讲解)

三、STM32 的内存分配

1、STM32 中的内存分配详解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值