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

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

变量的本质

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

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

相关文章
|
2月前
|
存储 C语言 C++
动态内存分配与指向它的指针变量
动态内存分配与指向它的指针变量
21 1
|
27天前
|
缓存 Java
Java中循环创建String对象的内存管理分析
Java中循环创建String对象的内存管理分析
22 2
|
1天前
|
缓存 Linux
linux性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)
这些工具可以帮助你监视系统的内存使用情况、识别内存泄漏、找到高内存消耗的进程等。根据具体的问题和需求,你可以选择使用其中一个或多个工具来进行内存性能分析。注意,内存分析通常需要综合考虑多个指标和工具的输出,以便更好地理解系统的行为并采取相应的优化措施。
13 5
|
4天前
|
机器学习/深度学习 分布式计算 数据处理
Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
【5月更文挑战第2天】Spark是一个基于内存的通用数据处理引擎,可以进行大规模数据处理和分析
18 3
|
6天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
8天前
|
缓存 Java Android开发
安卓开发中的内存泄漏分析与优化策略
【4月更文挑战第27天】 在移动应用开发领域,性能优化始终是提升用户体验的关键因素之一。特别是对于安卓平台,由于设备的硬件配置差异较大,良好的内存管理对于保证应用流畅运行尤为重要。本文将深入探讨安卓开发中常见的内存泄漏问题,并提供一系列检测和解决内存泄漏的实用策略。通过对工具的使用、代码实践以及系统架构设计的多维度分析,旨在帮助开发者有效避免和处理内存泄漏,确保应用性能稳定。
|
13天前
|
Java
【Java基础】面向对象和内存分析
【Java基础】面向对象和内存分析
13 0
|
13天前
|
存储 Java Shell
Android系统 实现低内存白名单防LMK原理分析
Android系统 实现低内存白名单防LMK原理分析
24 0
|
28天前
|
存储 程序员 编译器
c++面向对象概述、内存分析、引用、函数
c++面向对象概述、内存分析、引用、函数
|
2月前
|
SQL 运维 NoSQL
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
【Redis 故障排查】「连接失败问题排查和解决」带你总体分析CPU及内存的使用率高问题排查指南及方案
38 0