变量的本质分析、内存四区、函数调用模型

简介: 变量的本质分析、内存四区、函数调用模型

变量的本质

1、程序通过变量来申请和命名内存空间   int a =10

     int===>数据类型,相当于一个模板,告诉编译器分类4个字节的内存空间

    a===>相当于给这个分配的内存空间取义名称(当然内存地址编号也是该段内存的地址空间),通过这个名称就可以对这段空间进行操作了

    10===>相当于给这个空间赋值,让其暂时存储值10

2、通过变量名访问内存空间

     (一段连续)内存空间的别名(相当于一个名牌号,通过门牌号就可以找到你家)

        为什么是一段连续的内存空间呢?大家可以取查下主存-编址的相关内容

3、修改变量的两种方法

     =》直接修改    a=20

     =》间接修改 。内存有地址编号,拿到地址编号也可以修改内存   *(&a)=20

   =》通过取别名

4、数据类型和变量的关系

 =》通过数据类型定义变量

总结:对内存,可读可写;通过变量往内存读写数据,不是向变量读写数据,而是向变量所代表的内存空间中读写数据

//测试以下程序
#include <stdio.h>
void  main
{
     int i=0;
     printf("&i:%d\n",&i);
     *((int *)(12345024)) = 10;   // *(&i)=10;
     printf("i:%d",i);
}

程序的内存四区模型

流程说明:操作系统先将硬盘上的程序代码加载到内存中(如何加载,可以参考系统编程)

                  然后操作系统把C程序代码分为四个存储区

                  系统通过找到main函数作为入口,执行

各区存储的元素详解  (详细内容,可以参考虚拟地址4G)

栈区(stack):由编译器自动分配释放,存放局部变量
堆区(heap):一般由程序员分配(new , malloc,delete,free);如果程序员不释放,程序运行结束时可能由操作系统回收
全局区(static):全局变量和静态变量的存储是放一块的。初始化的全局变量和静态变量放一块,未初始化的放另一个地方。
常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统回收
代码区:存放函数体的二进制代码

函数调用模型

函数调用模型变量传递分析

以上为分析:

main函数中栈上、堆上、全局区分配的内存,可以被fa、fb使用

fa函数在栈上分配的内存不能被main使用,可以被fb使用,在全局区和堆区分配的内存可以被main和fb使用

fb函数在栈上分配的内存,不能被main和fa使用,在栈和全局区分配的可以被main和fa使用

总结和扩展

===》学好C语言的关键是建立程序运行的内存布局图

          内存四区图

          函数调用模型

扩展:

  一级指针内存布局图 (int *,char *)

 二级指针(int ** , char **)

指针做函数参数,要分清主调函数如何调用函数分配的内存,要分清是主调函数来分配内存还是调用函数。。。。。。

相关文章
|
19天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
49 1
|
2月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
53 2
|
14天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
24天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
143 9
|
29天前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
127 5
|
28天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
47 2
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
38 2
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1