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的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪
























