C++内存分布与进程地址空间

news2025/1/27 12:27:47

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…

设计新的 Kibana 仪表板布局以支持可折叠部分等

作者&#xff1a;来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese 在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能&#xff0c;同时为新的高级仪表板功能奠定了基础。 我们正在开…

用Python和Tkinter标准模块建立密码管理器

用Python和Tkinter标准模块建立密码管理器 创建一个简单的密码管理器应用程序&#xff0c;帮助用户存储和管理他们的密码。使用Python的tkinter模块来创建一个图形用户界面&#xff08;GUI&#xff09;。 本程序支持 添加、查看、搜索、复制、修改、删除 功能。 本程序使用 …

day1代码练习

输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身) #include <stdio.h>// 判断一个数是否为完美数的函数 int panduan(int n) {if (n < 2) {return 0; // 小于2的数不可能是完美数}int sum 1; // 因子和初始化为1&#xff08;因…

为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案

文章目录 导读为什么redis会开小差&#xff1f;1.连接数过多2.bigkey3.慢命令操作4.内存策略不合理5.外部数据双写一致性6.保护机制未开启7. 数据集中过期8. CPU饱和9. 持久化阻塞10. 网络问题结论 导读 提起分布式缓存&#xff0c;想必大多数同学脑海中都会浮出redis这个名字…

C# Interlocked 类使用详解

总目录 前言 在多线程编程中&#xff0c;确保多个线程对共享资源的安全访问是一个关键挑战。C# 提供了多种同步机制来处理并发问题&#xff0c;其中 System.Threading.Interlocked 类提供了一种轻量级的方法来进行原子操作。它允许您执行一些常见的增量、减量、交换等操作&…

VS Code i18n国际化组件代码code显示中文配置 i18n ally

VUE项目做i18n国际化之后&#xff0c;代码中的中文都变成了code这时的代码就会显得非常难读&#xff0c;如果有一个插件能把code转换成中文显示就好了 vscode插件搜索“i18n ally” 在项目根文件夹下创建文件&#xff1a;.vscode/settings.json settings.json 内容如下 {"…

MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

文章目录 一、前言1.1 MySQL体系结构1.2 MySQL日志分类1.3 其他几种日志1.3.1 查询日志1.3.2 慢查询日志1.3.3 错误日志 二、bin log 二进制日志2.1 bin log简介2.2 binlog日志格式2.3 日志删除2.4 写入/刷盘机制 三、undo log 回滚日志3.1 undo log简介3.2 隐藏字段 —— 事务…

一文速通stack和queue的理解与使用

CSTL之stack和queue 1.stack1.1.stack的基本概念1.2.stack的接口 2.queue2.1.queue的基本概念2.2.queue的接口 3.priority_queue3.1.priority_queue的基本概念3.2.priority_queue的接口3.3.仿函数 4.容器适配器5.deque5.1.deque的简单了解5.2.deque的优缺点 &#x1f31f;&…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

orbbec 奥比中光相机单目及多目调用方式python代码

这篇文章会介绍使用orbbec相机的一些常用代码梯子 orbbec 奥比中光Astra相机单目及多目调用方式编译sdk调用单相机调用多相机orbbec 奥比中光Astra相机单目及多目调用方式 Orbbec相机是一个专注于深度感知和计算机视觉应用的设备,通常用于3D扫描、手势识别、增强现实(AR)以及…

力扣hot100-->滑动窗口、贪心

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

PBFT算法

在我的博客中对于RAFT算法也有详细的介绍&#xff0c;raft算法包含三种角色&#xff0c;分别是&#xff1a;跟随者&#xff08; follower &#xff09;&#xff0c;候选人&#xff08;candidate &#xff09;和领导者&#xff08; leader &#xff09;。集群中的一个节点在某一…

跨境电商代购系统独立站深度分享

在全球化日益加深的今天&#xff0c;跨境电商代购系统独立站作为一种新兴的电子商务模式&#xff0c;正逐渐成为连接全球消费者与优质商品的重要桥梁。本文将详细介绍跨境电商代购系统独立站的基本功能以及技术实现的重难点&#xff0c;以期为相关从业者提供一些有价值的参考和…

携程旅行 登录分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 所有加密流程基本一样就说…

西藏酥油茶:高原上的醇香温暖

西藏酥油茶:高原上的醇香温暖 在西藏高原,有一种饮品,它不仅滋养了一代又一代的藏民,还承载着丰富的文化与历史,它就是西藏酥油茶。酥油茶,藏语称为“恰苏玛”,意为搅动的茶,是藏族人民日常生活中不可或缺的一部分,更是待客、祭祀等活动中的重要礼仪物品。 历史与文化渊源 酥…

刷题总结 回溯算法

为了方便复习并且在把算法忘掉的时候能尽量快速的捡起来 刷完回溯算法这里需要做个总结 回溯算法的适用范围 回溯算法是深度优先搜索&#xff08;DFS&#xff09;的一种特定应用&#xff0c;在DFS的基础上引入了约束检查和回退机制。 相比于普通的DFS&#xff0c;回溯法的优…

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面&#xff0c;包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF&#xff08;高频&#xff09; 或 UHF&#xff08;超高频&#xff09; 波段的无线通信协议&#xff0c;主要用于军事通信系统中。为了…