C++内存分布与进程地址空间
- 1.C/C++内存分布
- 2.进程地址空间(补充)
🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Linux的学习】
📝📝本篇内容:C/C++内存分布;进程地址空间(补充)
⬆⬆⬆⬆上一篇:程序地址空间
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-
1.C/C++内存分布
//测试内存分布
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Func1()
{}void Func2()
{}int uninit_global_val ;//未初始化全局变量
int global_val = 20;//初始化全局变量static int uninit_static_global_val;//未初始化的静态全局变量
static int static_global_val=20;//初始化静态全局变量int main(int argc,char* argv[],char* envp[])
{//栈区int stack_val_1 = 10;//栈区变量int stack_val_2 = 20;int stack_val_3 = 30;int stack_val_4 = 40;printf("stack_addr1:%p\n", &stack_val_1);printf("stack_addr2:%p\n", &stack_val_2);printf("stack_addr3:%p\n", &stack_val_3);printf("stack_addr4:%p\n", &stack_val_4);printf("------------------------------------\n");//堆区int* heap_val_1 = (int*)malloc(sizeof(int));//指向堆区变量int* heap_val_2 = (int*)malloc(sizeof(int));int* heap_val_3 = (int*)malloc(sizeof(int));int* heap_val_4 = (int*)malloc(sizeof(int));printf("heap_val_1:%p\n", heap_val_1);printf("heap_val_2:%p\n", heap_val_2);printf("heap_val_3:%p\n", heap_val_3);printf("heap_val_4:%p\n", heap_val_4);printf("------------------------------------\n");//静态区static int uninit_static_local_val;//未初始化的静态局部变量static int static_local_val=20;//初始化静态局部变量printf("uninit_global_val:%p\n", &uninit_global_val);//未初始化全局变量printf("uninit_static_golbal_val:%p\n",&uninit_static_global_val);//未初始化的静态全局变量printf("uninit_static_local_val:%p\n",&uninit_static_local_val);//未初始化的静态局部变量printf("\n");printf("global_val:%p\n", &global_val);//初始化的全局变量printf("static_local_val:%p\n",&static_local_val);//初始化的静态局部变量printf("static_global_val:%p\n",&static_global_val);//初始化的静态全局变量printf("------------------------------------\n");//只读数据const char* str = "hello world";//常量字符串printf("only_read:%p\n", str);printf("user_defined_code_addr:%p\n", Func1);//自定义函数->代码段printf("user_defined_code_addr:%p\n", Func2);printf("------------------------------------\n");//环境变量+命令行参数printf("environment_val:%p\n",envp[0]);printf("command_addr:%p\n",argv[0]);return 0;
}
验证代码时,建议在Linux下运行
2.进程地址空间(补充)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{//创建子进程int ret=fork();int val=10;if(ret==0){//子进程printf("child process,val=%d,&val=%p\n",val,&val);//sleep(1);exit(0);}//父进程printf("father process,val=%d,&val=%p\n",val,&val);sleep(1);//父进程结束,命令行就会出来,睡眠一秒,使子进程结束再出现命令行return 0;
}
我们先来看一下上面这段代码,就简单的父子进程打印val的值和地址,可以发现值和地址是一样的,符合我们的预期,它在内存中的表现如下
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{//创建子进程int ret=fork();int val=10;if(ret==0){//子进程val=20;//修改valprintf("child process,val=%d,&val=%p\n",val,&val);//sleep(1);exit(0);}//父进程printf("father process,val=%d,&val=%p\n",val,&val);sleep(1);//父进程结束,命令行就会出来,睡眠一秒,使子进程结束再出现命令行return 0;
}
造成上面现象的原因是因为我们修改的元素是物理内存中的,因此我们才会看见val的值变了,但是地址没变,看下面的图来理解一下
🌸🌸C++内存分布与进程地址空间的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪