📒博客主页:Morning_Yang丶
🎉欢迎关注🔎点赞👍收藏⭐️留言
📌本文所属专栏: 【Linux】
🙏作者水平有限,如果发现错误,敬请指正!感谢感谢!
文章目录
一、前言
在学习 C/C++ 的时候,我们知道内存会分为几个区域:栈区、堆区、全局/静态区、代码区、字符常量区 …
这只是语言层面的理解,是远远不够的,如下空间布局图,请问这是物理内存吗?—— 不是,是进程地址空间。
两点结论:
-
进程地址空间不是物理内存!
-
进程地址空间,会在进程的整个 [生命周期] 内一直存在,直到进程退出!
这也就解释了为什么全局/静态变量的生命周期是整个程序,因为全局/静态变量是随着进程一直存在的。
为了更好的学习进程地址空间,还需要理解如下四个问题:
- 验证地址空间的基本排布?
- 进程地址空间究竟是什么?
- 地址空间和物理内存之间的关系?
- 为什么要存在地址空间?
二、验证地址空间的基本排布(⭐)
代码如下:
/* checkarea.c */
#include<stdio.h>
#include<stdlib.h> // malloc
int g_unval; // 未初始化数据区
int g_val = 10; // 已初始化数据区
int main(int argc, char* argv[], char* env[])
{
printf("code addr : %p\n", main); // 代码区
printf("\n");
const char *p = "hello";
printf("read only : %p\n", p); // 字符常量区(只读)
printf("\n");
printf("global val : %p\n", &g_val); // 已初始化数据区
printf("global uninit val: %p\n", &g_unval); // 未初始化数据区
printf("\n");
char *phead = (char*)malloc(1);
printf("head addr : %p\n", phead); // 堆区(向上增长)
printf("\n")