复习C的内存管理

来自:漫谈C语言内存管理_c语言内存管理机制-CSDN博客

C语言是音视频开发所必须的。

变量是一段连续内存空间的别名。变量的类型是固定内存大小的别名。但是类型不是只确定了变量内存大小,还确定了变量是小数、整数还是字符。

linux32下的C的内存模型:

解释这些区:

代码区属于存放程序指令,常量区、全局数据区、堆区、栈区属于存放程序数据程序代码区、常量区、全局数据区在程序加载到内存后就分配好了,并且在程序运行期间一直存在,大小固定,只能等到程序运行结束后由操作系统收回栈区、堆区在程序运行时动态开辟

数据区域可读写,代码区域只可读,所以分区之后呢,可以将程序指令区域和数据区域分别设置成可读可写或只读。这样分有利于防止代码篡改。

  • 程序指令区域多个同样的程序一起运行的话,可以共享存储在指令区域的那一份程序代码,只是每一个程序运行中的数据不一样而已,这样可以节省大量的内存。
  • 数据区域
1、全局数据区

存储定义在函数外部的变量,可以被全局(其他文件)访问到。(一个区域的边界是一对花括号{})

2、常量区

存储字符串常量和const修饰的变量。

3、

栈由系统进行内存的管理。函数被调用时(一开始被调用就压入,而不是遇到递归函数的时候压入),会将参数、局部变量、返回地址、保存的上下文等与函数相关的信息压入栈中,函数执行结束后,系统自行释放栈区内存,不需要编程人员管理,这些信息都将被销毁。所以局部变量、参数只在当前函数中有效(函数中使用参数本质也是在函数栈中创建一块内存把参数拷贝过来(好像有误),所以两块区域,一个实参,一个形参。传递参数的方式可以是传值、传引用或传指针),不能传递到函数外部,因为它们的内存不在了。另外栈属于线程私有。

这里每个函数栈都会保存自己的栈底指针ebp,一边在下一个函数栈被回收之后,ebp可以指到自己函数栈的栈底,以便恢复现场。


实际上,程序启动时会为栈区分配一块大小适当的内存,对于一般的函数调用这已经足够了,函数进栈出栈只是 ebp、esp 寄存器指向的变换,或者是向已有的内存中写入数据,不涉及内存的分配和释放。我们经常听说“栈内存的分配效率要高于堆”就是这个道理,因为大部分情况下并没有真的分配栈内存,仅仅是对已有内存的操作。

4、堆

手动申请,手动释放;malloc/new申请堆;堆完全由程序员掌控(也是唯一由程序员完全控制的内存区域),想分配多少就分配多少,想什么时候释放就什么时候释放;

和栈比:容量大于栈;分配效率比栈低;引入了内存泄漏问题。

全局数据区、常量区、堆区、栈区的区分:

#include <stdio.h>
char *str1 = "c.biancheng.net";  //字符串在常量区,str1在全局数据区
int n;  //全局数据区
char* func(){char *str = "C语言";  //字符串在常量区,str在栈区return str;
}
int main(){int a;  //栈区char *str2 = "01234";  //字符串在常量区,str2在栈区char arr[] = "hello world!"; //注意字符数组存放的字符串不是常量,是可读可写的char  arr[20] = "56789";  //字符串和arr都在栈区char *pstr = func();  //栈区int b;  //栈区  int *ip = (int*)malloc(N * sizeof(int) //ip 在栈区,指向的内存在堆区return 0;
}

栈分配的内存在函数执行后释放:

char* testStack(){char p[] = "hello world!"; //字符串在栈区存储 printf("in testStack %s\n", p);return p;
}int main() {char* p = NULL;p = testStack();printf("out of testStack %s\n",p); //返回的是函数中的字符串的地址return 0;
}

对比:

char* testStack(){char *p = "hello world!"; //在常量区存储 printf("in testStack %s\n", p);return p;
}

堆的变量在手动释放前不会被释放,get()结束之后p的空间没有被回收。下面p指针和p指向的对象都存储在堆空间里面。

int *get()
{int *p = (int *)malloc(sizeof(int));//申请了一个堆空间*p = 10;return p;
}int main(){int *x = get();printf("x: %d\n", *x);
}

static变量是全局的。

全局static就不需要证明了,看下static局部变量的情况:

int testStatic() {static int s = 0;s = s + 1;return s;
}int main() {for (int i = 0;i<=10;i++){int a = testStatic();printf("a = %d\n", a);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频远程监控平台EasyCVR集成后播放只有一帧画面的原因排查与解决

智慧安防视频监控平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议…

Java中常用的集合及方法(2)

在Java&#xff08;JDK8&#xff09;中&#xff0c;集合&#xff08;Collection&#xff09;是数据结构的实现&#xff0c;用于存储和操作对象集合。 集合&#xff08;Collection&#xff09;中包含的一般类或接口&#xff1a; 在这其中呢&#xff0c;我们经常使用的其实就是L…

多边形质心(centroid)的计算方法

原文代码 // polygon按顺时针排列顶点 function getCentroid(polygon) {var totalArea 0var totalX 0var totalY 0var points polygon[0]for (var i 0; i < points.length; i) {// a、b以及原点构成一个三角形var a points[i 1]var b points[i]var area 0.5 * (a[…

Django模型层(附带test环境)

Django模型层(附带test环境) 目录 Django模型层(附带test环境)连接数据库Django ORM在models.py中建表允许为空指定默认值数据库迁移命令 开启测试环境建表语句补充(更改默认表名)数据的增加时间数据的时区 多表数据的增加一对多多对多 数据的删除修改数据查询数据查询所有数据…

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

哈希表应用

例题 在这里使用一个简化版的问题进行分析&#xff1a;给定N个自然数&#xff0c;值域是&#xff0c;求出这N个自然数中共有多少个不同的自然数。 分析 如果值域是&#xff0c;那么可以利用之前介绍过的计数排序算法解决问题。定义一个的大数组a&#xff0c;每个位置a[x]所对…

6. Gin集成redis

文章目录 一&#xff1a;连接Redis二&#xff1a;基本使用三&#xff1a;字符串四&#xff1a;列表五&#xff1a;哈希六&#xff1a;Set七&#xff1a;管道八、事务九&#xff1a;示例 代码地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/14-go-redi…

lvs集群中NAT模式

群集的含义 由多台主机构成&#xff0c;但对外表现为一个整体&#xff0c;只提供一个访问入口&#xff0c;相当于一台大型的计算机。 横向发展:放更多的服务器&#xff0c;有调度分配的问题。 垂直发展&#xff1a;升级单机的硬件设备&#xff0c;提高单个服务器自身功能。 …

贪吃蛇(C语言实现)

贪食蛇&#xff08;也叫贪吃蛇&#xff09;是一款经典的小游戏。 —————————————————————— 本博客实现使用C语言在Windows环境的控制台中模拟实现贪吃蛇小游戏。 实行的基本功能&#xff1a; • 贪吃蛇地图的绘制 • 蛇吃食物的功能&#xff08;上、…

Linux环境搭建Jenkins(详细图文)

目录 简介Jenkins 特点 一、环境准备 1.jdk环境准备 2.maven环境准备 3.git环境准备 二、安装部署Jenkins&#xff08;采用war包方式&#xff09; 1.下载Jenkins ​2.启动war包 1&#xff09;将下载好的Jenkins的war包上传到服务器上 2&#xff09;编辑启动脚本,方便…

微信私信短剧机器人源码

本源码仅提供参考&#xff0c;有能力的继续开发 接口为api调用 云端同步 https://ys.110t.cn/api/ajax.php?actyingshilist 影视搜索 https://ys.110t.cn/api/ajax.php?actsearch&name剧名 每日更新 https://ys.110t.cn/api/ajax.php?actDaily 反馈接口 https://ys.11…

Python图像处理:1.插值、频域变换与对比度增强

一、几何变换 7.图像的插值 (1)原理介绍 下面对比三种插值方法&#xff0c;分别是最近邻插值法、双线性插值法、卷积插值法&#xff0c;三种方法的前提和特点、优缺点、适用场景如下&#xff1a; 最近邻插值&#xff08;Nearest Neighbor Interpolation&#xff09;&#xf…

Kotlin dist downloading failed

现象&#xff1a; 在使用AndroidStudio编写Flutter项目时总是在工具的右下角提示错误信息 该问题通常在刚刚打开AndroidStudio时报出&#xff0c;但可以正常编译和运行flutter项目即Android项目 分析&#xff1a;Flutter项目组认为这是AndroidStudio工具平台本身的问题非Flut…

Spring Boot整合zxing实现二维码登录

zxing是google的一个二维码生成库&#xff0c;使用时需配置依赖&#xff1a; implementation("com.google.zxing:core:3.4.1") implementation("com.google.zxing:javase:3.4.1") zxing的基本使用 我们可以通过MultiFormatWriter().encode()方法获取一个…

CSS顶部与JS后写:网页渲染的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

惬意上手MySQL

大家好&#xff0c;我又来写博客了&#xff0c;今天给大家介绍一下MySQL,如果你只想让MySQL作为自己的辅助开发工具&#xff0c;那这一篇文章就够了&#xff0c;如果想作为一门语言来学习&#xff0c;那你可以看此文章了解一些基础。 MySQL介绍 数据库可分为关系型数据库和非关…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ &#xff0c;常常会使用统计方法如最小二乘法、信息准则&#xff08;如AIC、BIC&#xf…

【牛客】VL69 脉冲同步器(快到慢)

描述 sig_a 是 clka&#xff08;300M&#xff09;时钟域的一个单时钟脉冲信号&#xff08;高电平持续一个时钟clka周期&#xff09;&#xff0c;请设计脉冲同步电路&#xff0c;将sig_a信号同步到时钟域 clkb&#xff08;100M&#xff09;中&#xff0c;产生sig_b单时钟脉冲信号…

SpringMVC07、整合SSM

7、整合SSM 7.1、环境要求 环境&#xff1a; IDEAMySQL 5.7.19Tomcat 9 Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识&#xff1b; 7.2、数据库环境 创建一个存放书籍数据的数据库…

文本生成视频:从 Write-a-video到 Sora

2024年2月15日&#xff0c;OpenAI 推出了其最新的文本生成视频模型——Sora。Sora 能够根据用户的指令生成一分钟长度的高质量视频内容。这一创新的发布迅速在社会各界引发了广泛关注与深入讨论。本文将围绕本实验室发表于SIGGRAPH AISA 的 Write-a-video和 Sora 展开&#xff…