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

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

变量的本质

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 **)

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

相关文章
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
10月前
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
583 3
|
6月前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
180 4
|
6月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
172 2
|
9月前
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
561 4
AI代理内存消耗过大?9种优化策略对比分析
|
8月前
|
人工智能 边缘计算 自然语言处理
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
随着模型量化技术的发展,大语言模型(LLM)如今可在低配置设备上高效运行。本文介绍本地部署LLM的核心技术、主流工具及十大轻量级模型,探讨如何在8GB内存环境下实现高性能AI推理,涵盖数据隐私、成本控制与部署灵活性等优势。
6827 0
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
|
存储 人工智能 编解码
TripoSF:3D建模内存暴降80%!VAST AI新一代模型细节狂飙82%
TripoSF 是 VAST AI 推出的新一代 3D 基础模型,采用创新的 SparseFlex 表示方法,支持 1024³ 高分辨率建模,内存占用降低 82%,在细节捕捉和复杂结构处理上表现优异。
424 10
TripoSF:3D建模内存暴降80%!VAST AI新一代模型细节狂飙82%
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
669 159
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
125 4