程序执行时的内存分配

程序运行时的内存空间分布 我们在写程序时,既有程序的逻辑代码,也有在程序中定义的变量等数据,那么当我们的程序进行时,我们的代码和数据究竟是存放在哪里的呢?下面就来总结一下。 一、程序运行时的内存空间情况 其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,以虚拟地址来看,数据或代码是一块块 阅读详情

 

一、在程序执行期间,变量存储空间有三种:
1、静态存储区。内存在程序编译的时候就已经分配好了,这块内存在程序执行期间都存在,
存储全局变量和静态变量。
2、栈存储区。内存是在程序执行期间才分配的,函数内局部变量及函数参数的存储单元,当
函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率
高但容量小。
3、堆存储区。在程序执行时由程序员用malloc或new申请的内存,程序员自己负责何时用
free或delete释放分配的内存。频繁的分配和释放不同大小的堆内存将会产生堆内碎片。
二、程序将操作系统分配给它运行的内存分成五个区域:
1、栈区,存放局部变量,函数参数,返回数据,返回地址等。
2、堆区,由程序员分配及释放。
3、静态存储区,存放全局变量、静态变量和常量。具体由三部分组成:
  1>已初始化的全局变量和静态变量。
  2>未初始化的全局变量和静态变量。
  3>常量数据区。
4、文字常量区,程序中使用的常量字符串,程序结束后由系统释放。
5、程序代码区,存放函数体的二进制代码。
例1:

/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

int a=0; //存放在静态初始化区
const int b=2; //存放在常量数据区
static int val=10; //存放在静态初始化区
char *p1; //存放在静态未初始化区

void main(int argc,char *argv[])
{
int c; //存放在栈区
char s[]="sss"; //s存放在栈区,"sss"存放在常量区
char *p2; //存放在栈区
char *p3="hello"; //p3存放在栈区,"hello"存放在常量区
static int d=1; //存放在静态初始化区

p1=(char *)malloc(sizeof(char)*10); //存放在堆中
p2=(char *)malloc(sizeof(char)*10); //存放在堆中

strcpy(p1,"world"); //"world"存放在常量区
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
例2:

/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

int main(int argc,char *argv[])
{
char *ptr="Hello";

*ptr='L';
printf("%s\n",ptr);

return 0;
}
结果:
Segmentation fault
说明:“Hello”保存在常量区中,所以不能改变。

/////////////////////////////////////////////////////////////////////////////////////////////////////
例3:

/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

int main(int argc,char *argv[])
{
char str[10]="world";
char *p=str;
*p='H';

printf("%s---%s\n",p,str);

return 0;
}
结果:Horld---Horld
说明:变量str在保存栈中,即“world”在栈中,所以可以改变

/////////////////////////////////////////////////////////////////////////////////////////////////////

三、堆栈区别
栈:由系统自动分配,由编译器管理;申请效率高,但程序员无法控制;在函数调用中,第
一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后
是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变
量,当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的
地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:由程序员申请,由程序员管理;速度慢,且容易产生碎片,但程序员能够控制,使用方
便;一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

程序运行时,内存到底是如何进行分配的? 作者:沅兮 链接:https://juejin.cn/post/7035932555740184583 Java运行时内存分配 将 Java 内存分为堆内存(heap)和栈内存(Stack)并不准确,Java 的内存区域划分实际上更为复杂。 Java 虚拟机在执行 Java 程序的过程中,会把它所管理的内存划分为不同的数据区域: 上图中: HelloWorld.java会经过编辑生成HelloWorld.class字节码文件。 Java 虚拟中要想访问HelloWorld... 阅读详情

相关推荐

智能音箱开发者必看:CEVA-BX vs Cadence HiFi音频DSP实战选型指南(附功耗对比表)

本文深入对比了CEVA-BX和Cadence HiFi两大音频DSP架构在智能音箱开发中的性能差异,涵盖语音唤醒、多麦克风阵列处理等核心场景。通过实测数据和功耗对比表,为开发者提供选型参考,帮助优化产品性能和能效表现。

weixin_29309213的博客 227

程序在内存中的布局

程序在运行时,由操作系统将可执行文件载入到计算机的内存中,成为一个进程(process)。程序进程被创建时,系统就会为其分配内存空间。程序在内存中的布局由5个段(segment)组成,如下图所示: 1、代码段代码段(code segment)存放程序执行的机器指令。通常情况下,代码段是可共享的,使其可共享的目的是,对于频繁被执行的程序,只需要在内存中有一份副本即可。代码段是只读的,使其只读的原因是

qq_28249373的博客 4518

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 820

编译时分配存储单元

编译时分配存储单元 指的是确定了内存分配的方案,你可以理解成编译期间它为你规划好了这些变量的内存使用方案. 静态存储方式:变量存储在内存中的静态存储区,在编译时就分配了存储空间. 动态存储方式:变量存储在内存中的动态存储区,只有变量被调用时才临时分配内存单元,调用结束,空间释放. ...

weixin_42309501的博客 1419

避开这些坑!用Python ReportLab生成PDF时字体处理与中文排版的5个关键技巧

本文针对Python ReportLab库在PDF自动化生成中常见的中文排版难题,提供了五个关键技巧。内容涵盖字体注册的稳健策略、段落样式的精细控制、表格内中文的换行对齐、页面布局管理以及性能优化,旨在帮助开发者彻底解决中文乱码、排版错位等问题,生成专业美观的PDF文档。

weixin_29250403的博客 624

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2034

堆和栈的区别

一、sql合并行 使用join   二、堆和栈的区别 1、栈是编译期间就分配好的内存空间,代码中大小有明确的定义;是一片连续的内存域,由系统自动分配和维护;值类型和指针总是存放在栈上 2、堆是程序运行期间动态分配的内存空间,根据你运行的情况分配空间大小;不是连续的内存域,由用户自动控制和释放,当内存达到特定值的时候,由GC机制来回收,而引用类型总是存放在堆中 3、当我们使用引用类型时,...

qq_42653574的博客 538

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4829

程序执行时的内存分配情况总结!

管理方式不同:栈是由编译器自动申请和释放空间,堆是需要程序员手动申请和释放;空间大小不同:栈的空间是有限的,在64位平台下,VC6下默认为2M,堆最大可以到4G;能否产生碎片:栈和数据结构中的栈原理相同,在弹出一个元素之前,上一个已经弹出了,不会产生碎片,如果不停地调用malloc、free对造成内存碎片很多;生长方向不同:堆生长方向是向上的,也就是向着内存地址增加的方向,栈刚好相反,向着内存减小的方向生长。分配方式不同:堆都是动态分配的,没有静态分配的堆。栈有静态分配和动态分配。

timeflyfast的博客 593

当Kmer遇到多倍体:复杂基因组Survey分析中的避坑指南

本文针对小麦、棉花等多倍体及高杂合复杂基因组的Survey分析,深入解析了Kmer分布图解读中的常见陷阱。文章重点探讨了如何超越理想二倍体模型,利用Smudgeplot等工具准确判断基因组倍性,并提供了从参数优化、污染判断到结果验证的全流程实战指南,帮助研究者规避错误,获得更准确的基因组大小、杂合度等关键信息。

yhn45678901的博客 1008

tsfknn 预测R语言中的时间序列

rolling参数应该设置为FALSE,这使得最后的18个观测值成为测试集,其余的作为训练集;如果我们将rolling参数设置为默认值TRUE,那么测试集就不会是一个恒定的向量。lag 滞后参数表示时间序列数据的滞后值。在这个例子中,由于我们的时间序列数据是月度的,我们将参数设置为1:12。作为药品福利计划的一部分,澳大利亚健康保险委员会记录的属于ATC代码A10的产品的每月政府支出(百万美元)。我们将使用tsfknn包,它可以用来预测R语言中的时间序列。格式:ts类别的月度时间序列。

Mrrunsen的博客 323

J2SE基础篇——数据类型、运算符、语句、程序执行时内存分配、进制、编码

Java视频看了近半,总体感觉非常简洁,没有像vb.net那么多的关键字,也比较容易上手;马士兵老师是从内存的角度来分析程序的运行,理解起来轻松了不少,通过视频对面向对象的三大特性又有了一个比较深刻的认识。 下面对Java的基础语法做一个罗列: 基本数据类型 按照声明位置划分                       局部变量:方法或语句块部定义的变量

袁伏彪 —— 共享,共赢 2318

Vue3 - 详解实现网站接入微信扫码登录功能,微信授权生成登录二维码用户用手机扫描二维码登陆,微信扫描二维码登录详细流程及示例代码,支持弹框式、浏览器单独新开页显示,最新vue集成微信扫码授权登录!

vue3,nuxt3,PC网站,网页,微信扫码登录,微信登陆,vue3微信扫码登录,获取个人信息,扫码登录后如何获取用户手机号,微信扫码授权登录,vue3详细实现微信扫一扫登陆,pc网页微信登录,vue3集成微信扫码登录,详细流程和示例源码,第三方扫码登录,vue3微信扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,微信扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描微信二维码登录网站,最好用的插件,vue-wxlo

🏆 前端领域优质创作者 1万+

程序执行过程动态图

                                             

捕影世界 2365

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java程序执行内存分析(栈、堆、方法区)

我们结合实际程序例子来对Java程序执行的内存进行分析,以对java语言有个更深的了解注意以下代码和实际逻辑做了一些简化,目的是能够将重点放在内存分析上,把最核心的拎出来Computer类 public class Computer { public String brand; public String cpuSpeed;} Student类public class Student

RhymeChiang 910

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java运行期间内存分配详解

明确期间 首先要明确的是我们讨论的各类型变量占用内存是指在运行期间所占系统内存,也就是你开启这个java程序后所占的内存。这点需要明确,因为你没有运行项目时,他就是一个java文件,静态的,他跟word文档一样占用几kb的字符内存这个就跟你代码长短有关系跟他里面写的什么是没关系的。 所以我觉得有些文章讨论的是在编译期占内存,我觉得是没有理解内存的。因为编译期间,不过是把.java文件编译成.cla...

Charles Ren's Tech Blog 1569

程序编译后运行时的内存分配-转

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33804582的博客 115

计算机编程语言原理与源码实例讲解:9. 运行时环境与内存管理

1.背景介绍 运行时环境(Runtime Environment)和内存管理(Memory Management)是计算机编程语言的基础部分,它们在程序的执行过程中发挥着关键作用。运行时环境负责为程序提供所需的资源和服务,而内存管理则负责在程序运行过程中动态地分配和回收内存空间。在本文中,我们将深入探讨这两个领域的核心概念、算法原理和实例代码,并分析其在现代计算机编程语言中的重要性和未来发展趋势...

AI天才研究院 1073

程序编译后运行时的内存分配

原文地址不详,我的转载的来源:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一、编译时与运行时的内存情况 1.编译时不分配内存 编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。 2.运行时必分配内存 运行时程序是必须调到“内...

weixin_30423977的博客 93

JVM运行时数据区

运⾏时数据区也就是JVM在运⾏时产⽣的数据存放的区域,这块区域就是JVM的内存区域,也称为JVM的内存模型——JMM(Java Memory Model)JMM分成了这么⼏个部分堆空间(线程共享):存放new出来的对象元空间(线程共享):存放类元信息、类的模版、常量池、静态部分线程栈(线程独享):⽅法的栈帧本地⽅法栈(线程独享):本地⽅法产⽣的数据程序计数器(线程独享):配合执⾏引擎来执⾏指令**注:**堆、元空间(含方法区)是线程共享的,线程栈、本地⽅法栈、程序计数器是独享的。

个人笔记git:https://gitee.com/tlangp/note.git 410

采用段式存储管理时,一个程序如何分段是在什么时候决定的?

采用段式存储管理时,一个程序如何分段是在( )决定的? A.分配主存 B.用户编程 C.装作业 D.程序执行 分析: 要得到物理地址才能分配主存,而得到逻辑地址之后才能得到物理地址,而分段之后才能得到逻辑地址 至于装作业和程序执行,也需要得到物理地址之后才能进行,很好想,要知道真正的地址,我才能装作业,才能干活。 根据这个地址变换表,很明显也能看出要得到物理地址,是在得到逻辑地址之后。 ...

syh666233的博客 4283

何为运行时(Runtime)

Runtime(运行时) 是计算机程序中实际执行的阶段,指从程序启动到终止的整个运行过程。它涵盖了程序运行所需的环境、资源管理和底层支持机制

铁马冰河入梦 1735

[转] C++程序内存分配的问题

作者:mailto:arenak@sohu.com 概述:         在C++中对象可以静态分配——即编译器在处理程序源代码时分配也可以动态分配——即程序执行时调用运行时刻库函数来分配。静态内存分配是在程序执行之前进行的因而效率比较高,而动态内存分配则可以灵活的处理未知数目的元素。分析:        静态与动态内存分配的两个主要区别是:1.静态对象是有名字的变量我们直接对其进行操作而动态对

GameDev - gamefish 1022

C++中未初始化的局部变量与全局变量的区别

C++中未chu

Victorleehugo的专栏 2484

C++程序内存分配的问题

作者:mailto:arenak@sohu.com 概述:         在C++中对象可以静态分配——即编译器在处理程序源代码时分配也可以动态分配——即程序执行时调用运行时刻库函数来分配。静态内存分配是在程序执行之前进行的因而效率比较高,而动态内存分配则可以灵活的处理未知数目的元素。分析:        静态与动态内存分配的两个主要区别是:1.静态对象是有名字的变量我们直接对其进行操作而动态对

GameDev - gamefish 1126
上一篇: ubuntu Qt 找不到 -lGL
下一篇: send返回值
pompousx
博客等级 码龄10年 25粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值