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;
//修改val
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的值变了,但是地址没变,看下面的图来理解一下
🌸🌸C++内存分布与进程地址空间的知识大概就讲到这里啦,博主后续会继续更新更多Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪