(二)程序中的内存&&栈
一、程序运行为什么需要内存?基本概念?
内存是程序运行的立足之地,程序需要用内存来存储一些变量。
内存管理最终是由操作系统完成的,内存在本质上是一个硬件器件,由硬件系统提供;内存由操作系统统一管理,为了管理内存方便,操作系统提供了很多机制来让我们应用程序使用内存。这些机制彼此不同,各有各的特点,我们程序根据自己的实际情况来分配内存(暂时获得内存的使用权),使用内存,释放内存(向操作系统归还内存使用权限)。在C语言中获得内从的方法为栈、堆、数据区
二、栈
在C语言中,局部变量是存在于栈中的,栈是一段有限的内存空间。栈是自动分配自动收回,不需要程序员干预,方便简单。
反复使用:栈内存其实是一段固定空间的存储块,程序反复使用这块空间。我们要注意不能函数中返回一个局部变量的地址,因为内存是暂时的,后面会被覆盖掉。
#include<stdio.h>
int *Fun(void)
{
int a = 2;
return &a;
}
void Fun1(void)
{
int b = 5;
int c = 6;
}
int main()
{
int *P;
int *P1;
P = Fun();
printf("a = %d\n",*P);
Fun1();
Fun1();
printf("a = %d\n",*P);
return 0;
}
这段程序输出如下所示:

我们只要铭记在函数中不能返回局部变量的地址就不会犯这个错误了。
脏内存:内存空间反复使用,每次使用完成后程序都不会去清理,因此分配时保留了原来的值,我们要注意在定义局部变量时一定要进行初始化。
栈会溢出:因为栈的大小是固定的,如果超过这个内存大小,便会溢出。
#include<stdio.h>
void stack_overflow(void)
{
int a[] = {};
a[-] = ;
}
int main()
{
stack_overflow();
return ;
}
#include<stdio.h>
void stack_overflow2(void)
{
int a = ;
stack_overflow2();
}
int main()
{
stack_overflow2();
return ;
}
这两个代码都会导致栈溢出。
(二)程序中的内存&&栈的更多相关文章
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
- 了解 JavaScript 应用程序中的内存泄漏
简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...
- 高效使用 JavaScript 闭包,避免 Node.js 应用程序中的内存泄漏
在 Node.js 中,广泛采用不同形式的闭包来支持 Node 的异步和事件驱动编程模型.通过很好地理解闭包,您可以确保所开发应用程序的功能正确性.稳定性和可伸缩性. 闭包是一种将数据与处理数据的代码 ...
- [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 浅谈c语言程序为什么需要内存 栈又是什么?
.关于内存(程序的执行需要内存的支持) ()内存本身在物理上是硬件器件,由操作系统提供 ()内存的管理最终由操作系统统一管理.为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同 ...
- C程序中的内存分布
一个典型的C程序存储分区包含以下几类: Text段 已初始化数据段 未初始化数据段 栈 堆 进程运行时的典型内存布局 1. Text段 Text段通常也称为代码段,由可执行指令构成,是程序在目标文件或 ...
- iOS程序中的内存分配 栈区堆区全局区
在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...
- _CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)
// .h 文件 #pragma once class CConsoleDump { public: explicit CConsoleDump(LPCTSTR lpszWindowTitle = N ...
- 如何使用 VLD 检测程序中的内存泄漏?
下载地址:https://kinddragon.github.io/vld/ 下载 windows 安装包,进行安装即可,它会给你设置好 vs 的环境变量,使用时,直接在 vs ide 中包含即可. ...
随机推荐
- 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append性能好
如果在编写代码的过程中大量使用+进行字符串评价还是会对性能造成比较大的影响,但是使用的个数在1000以下还是可以接受的,大于10000的话,执行时间将可能超过1s,会对性能产生较大影响.如果有大量需要 ...
- 每日一九度之 题目1041:Simple Sorting
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4883 解决:1860 题目描述: You are given an unsorted array of integer numbers. ...
- Linux hrtimer分析(2)
http://blog.csdn.net/angle_birds/article/details/17375901 本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时 ...
- js继承---类继承法
//父类 function Aaa(name,sex,inter){ this.name = name; this.sex = sex; this.inter = [1,2,3]; } Aaa.pro ...
- HDU 4706:Children's Day
Children's Day Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Floyd-Warshall算法,简称Floyd算法
Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3). 使用条件&范围通常可以在任何图中使用,包括有向图.带负权边的图. Floyd-W ...
- Winform知识
文档界面 分类: 1.单文档界面应用程序(SDI) 特点: 1.应用程序中SDI的所有窗体都彼此独立 2.多文档界面应用程序(MDI) 特点: 1.每个应用程序中只能有一个MDI父窗体,在父窗体中可以 ...
- TestNG测试框架在基于Selenium进行的web自动化测试中的应用
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ TestNG+Selenium+Ant TestNG这个测试框架可以很好的和基于Selenium的 ...
- sorl维护索引库sorl4j的使用
1.维护索引库 添加:添加一个json格式的文件就可以. 修改:在solr中没有update,只需要添加一个新的文档,要求文档id和被修改文档的id一致.原理是先删除后添加. 删除:使用xml格式. ...
- #ifdef DEBUG的理解
今天看到一段代码,对ifdef的概念比较模糊,于是去学习了一下,找到一个很好的解释,如下: 在工程设置里有一些设置会对该工程自动产生一系列的宏,用以控制程序的编译和运行.就好象楼上说的一样,如果你把代 ...