C程序地址空间

目录

1.地址空间分布

2.各区域内容 

3.验证地址空间排布


1.地址空间分布

        在C语言中,每个C程序加载进内存时,操作系统都会给它分配虚拟地址空间,一般大小为4G,地址空间分布情况如下:

从上到下分别为代码区,字符常量区,已初始化全局变量区,未初始化全局变量区,堆区和栈区 ,其中堆栈相对而生


注:C程序地址空间不是内存,本质上是虚拟地址。

2.各区域内容 

         下面是各个区域的名称以及所存放的内容(地址由低到高):

地址空间区域内容
栈区局部变量,函数所形成的栈帧
堆区malloc,realloc等所申请的动态空间
未初始化全局变量区未初始化的全局变量,static修饰的变量
已初始化全局变量区已初始化的全局变量,static修饰的变量
字符常量区字符串常量
代码区代码(包括函数)

3.验证地址空间排布

        我们可以根据每个区域存放的内容来定义多种数据类型,通过它们的地址来验证各区域的相对位置。(注:由于windows具有栈随机化保护的特性,得出的结果可能有所不同,因此我们将在Linux系统下进行验证。)

#include<stdio.h>
#include<stdlib.h>
int g_val2;      //未初始化全局变量
int g_val1 = 10; //已初始化全局变量
int main()
{
	printf("code addr: %p\n", main);       //函数地址,代表代码区,函数是代码的一部分
	const char* str = "hello world";        //str存放字符串常量的首地址,指向字符常量区
	printf("read only: %p\n", str);        //字符常量区
	printf("init g_val: %p\n", &g_val1);    //已初始化全局变量区
	printf("uninit g_val: %p\n", &g_val2);  //未初始化全局变量区

	char* p = (char*)malloc(10 * sizeof(char));   //动态内存开辟,p指向堆区
	char* p1 = (char*)malloc(10 * sizeof(char));
	char* p2 = (char*)malloc(10 * sizeof(char));
	printf("head addr: %p\n", p);                //堆区
	printf("head addr: %p\n", p1);
	printf("head addr: %p\n", p2);
	printf("stack addr: %p\n", &str);            //栈区
	printf("stack addr: %p\n", &p);
	printf("stack addr: %p\n", &p1);
	printf("stack addr: %p\n", &p2);

	return 0;
}

在Linux系统运行结果如下:

        我们不难发现,各区域所在地址从上到下是呈递增的趋势的。所以地址从低到高分别是代码区,字符常量区,已初始化全局变量区,未初始化全局变量区,堆区和栈区,符合一开始的地址空间分布图。 


        对于堆区,我们定义了先后开辟的3个堆空间,并将地址保存在p,p1,p2中。通过p,p1,p2存放的地址呈递增趋势我们可以得出堆区的增长方向是从低地址向高地址增长的。


        对于栈区,由于变量str,p,p1,p2是在栈上先后开辟的,我们通过&取得它们的地址。根据打印的结果我们发现地址呈递减趋势可以得出栈区的增长方向是从高地址向低地址增长的。因此,堆栈相对而生


        值得注意的是,堆区和栈区的地址位数差了6位,说明两个区域之间有很大的镂空。


 以上,就是本期的全部内容。

制作不易,能否点个赞再走呢qwq

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: mpc8377是一款嵌入式微处理器,其地址空间是指在该处理器中可以用来寻址和访问的内存空间大小。 mpc8377的地址空间是32位的,即可寻址的内存空间大小为2的32次方。这意味着mpc8377可以寻址的内存空间大小为4GB。 在这4GB的地址空间中,有一部分是保留给处理器本身的功能和寄存器,用来控制和管理处理器的各项操作和功能。这部分地址空间被称为特殊功能寄存器(Special Function Registers,简称SFR),存放着和处理器相关的控制、状态和配置信息。 除了特殊功能寄存器之外,剩余的地址空间就可以用于存放程序代码和数据等。这其中又可以划分为物理地址和虚拟地址空间。 物理地址空间是指直接对底层硬件进行寻址的地址空间,用于与外部设备进行直接的读写操作。这部分地址空间大小取决于实际的硬件资源和外设的连接方式。 虚拟地址空间是指由操作系统管理的逻辑地址空间,用于给不同进程分配独立的内存空间。每个进程都有自己独立的虚拟地址空间,使得各个进程之间的内存空间彼此隔离,互不干扰。 总之,mpc8377的地址空间包括特殊功能寄存器、物理地址空间和虚拟地址空间。这些地址空间的大小和分配方式决定了mpc8377处理器的内存访问能力和内存管理方式。 ### 回答2: mpc8377是一款嵌入式处理器,具有强大的处理能力和丰富的外设功能。地址空间是指该处理器能够寻址的物理地址范围。 mpc8377处理器的地址空间是32位的,可以寻址的物理地址范围为0x00000000到0xFFFFFFFF,即4GB的空间。这个范围包括了处理器所能访问的全部内存和外设地址。 在这4GB的地址空间中,处理器将其中的一部分用于访问内存,另一部分则用于访问外设。关于内存访问,mpc8377处理器支持多种内存映射模式,包括物理内存、虚拟内存和交换内存等。通过适当的配置,可以将不同的内存区域映射到不同的物理地址范围,实现对不同类型内存的灵活管理。 对于外设访问,mpc8377处理器提供了丰富的接口和控制器,包括以太网接口、串口、USB接口、SPI接口、I2C接口、SD卡接口等。每个外设在地址空间中都被分配了一段地址范围,处理器可以通过读写这些地址来与外设进行通讯和控制。 除了内存和外设之外,mpc8377处理器还将一些特殊功能映射到特定的地址,以实现一些特殊的处理,例如中断控制器、DMA控制器、时钟控制器等。这些功能一般被认为是处理器核心的一部分,但在地址空间中也有相应的映射地址。 综上所述,mpc8377处理器的地址空间是可寻址的4GB物理地址范围,用于访问内存、外设和特殊功能。通过合理设置,可以实现对不同类型资源的管理和控制,满足不同的应用需求。 ### 回答3: MPC8377是一款处理器,它具有32位地址空间地址空间是计算机系统用来存储、管理和寻址数据的一种机制。MPC8377的地址空间大小为32位,即它能够寻址的内存范围为2的32次方,也就是4GB。 在MPC8377的地址空间中,有多个不同的部分用来存储不同的数据或代码。其中,最常见的是物理内存空间,用来存放程序执行所需的指令和数据。除此之外,还有一些特殊的地址空间,如I/O空间,用来访问外部设备的寄存器或接口。 MPC8377的地址空间可以根据需要,动态分配给不同的模块或任务。例如,操作系统可以为每个进程分配独立的地址空间,使不同的进程之间互相隔离,提高系统的安全性和稳定性。 此外,MPC8377还支持虚拟地址空间,通过虚拟地址和物理地址的映射,实现了对内存的更灵活的管理。虚拟地址空间使得每个进程看到的内存空间都是连续的,从而简化了程序开发和调试过程。 总结来说,MPC8377的地址空间是一种用来存储、管理和寻址数据的机制,它具有32位大小的寻址能力,可以支持4GB的内存空间。地址空间可以动态分配给不同的模块或任务,通过虚拟地址空间的支持,可以更灵活地管理内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值