朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
1. 程序地址空间分布
在C语言阶段就了解过这个图,那么本章来配合代码深入了解一下:
#include <stdio.h> #include <stdlib.h> int un_gval; int init_gval = 100; int main(int argc, char *argv[], char *env[]) { printf("code addr: %p\n", main); // 代码区 const char *str = "HelloLinux!"; printf("read only char addr: %p\n", str); // 字符常量区 printf("init global value addr: %p\n", &init_gval); // 已初始化全局数据区 printf("uninit global value addr: %p\n", &un_gval); // 未初始化全局数据区 char* heap = (char*)malloc(100); printf("heap addr: %p\n", heap); // 堆区 printf("stack addr: %p\n", &str); // 栈区 int i = 0; for(i = 0; argv[i]; i++) { printf("argv[%d]: %p\n",i, argv[i]); // 命令行参数 } for(i = 0; env[i]; i++) { printf("env[%d]: %p\n",i, env[i]); // 环境变量 } return 0; }
使用代码将对应区域的地址打印出来可以发现于图片完全一致。
① 在程序地址空间中的堆区是向上增长的,栈区是向下增长的,通常也叫做堆栈相对而生。
② 我们定义的任何类型(栈区中)都是整体向下开辟,使用时局部向上使用。
③ 在栈中定义的int类型变量是4个字节,我们要访问时,需要通过它的起始地址再配合它的类型大小进行访问,变量类型大小就相当于起始地址的偏移量,访问的形式就是起始地址 + 偏移量。
④ static修饰局部变量本质上就是将局部变量的地址放到了全局区(全局变量)。
2. 基于地址空间,重新理解地址
在之前的进程创建与进程fork本质章节中遗留了一个问题:如何理解同一个变量会有两个不同的指?
#include <stdio.h> #include <stdlib.h> #include <uni

使用代码将对应区域的地址打印出来可以发现于图片完全一致。

最低0.47元/天 解锁文章
992

被折叠的 条评论
为什么被折叠?



