一、程序运行为什么需要内存?基本概念?

  内存是程序运行的立足之地,程序需要用内存来存储一些变量。

  内存管理最终是由操作系统完成的,内存在本质上是一个硬件器件,由硬件系统提供;内存由操作系统统一管理,为了管理内存方便,操作系统提供了很多机制来让我们应用程序使用内存。这些机制彼此不同,各有各的特点,我们程序根据自己的实际情况来分配内存(暂时获得内存的使用权),使用内存,释放内存(向操作系统归还内存使用权限)。在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 ;
}

这两个代码都会导致栈溢出。

(二)程序中的内存&&栈的更多相关文章

  1. [转载]Java应用程序中的内存泄漏及内存管理

    近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...

  2. 了解 JavaScript 应用程序中的内存泄漏

    简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...

  3. 高效使用 JavaScript 闭包,避免 Node.js 应用程序中的内存泄漏

    在 Node.js 中,广泛采用不同形式的闭包来支持 Node 的异步和事件驱动编程模型.通过很好地理解闭包,您可以确保所开发应用程序的功能正确性.稳定性和可伸缩性. 闭包是一种将数据与处理数据的代码 ...

  4. [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. 浅谈c语言程序为什么需要内存 栈又是什么?

    .关于内存(程序的执行需要内存的支持) ()内存本身在物理上是硬件器件,由操作系统提供 ()内存的管理最终由操作系统统一管理.为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同 ...

  6. C程序中的内存分布

    一个典型的C程序存储分区包含以下几类: Text段 已初始化数据段 未初始化数据段 栈 堆 进程运行时的典型内存布局 1. Text段 Text段通常也称为代码段,由可执行指令构成,是程序在目标文件或 ...

  7. iOS程序中的内存分配 栈区堆区全局区

    在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...

  8. _CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)

    // .h 文件 #pragma once class CConsoleDump { public: explicit CConsoleDump(LPCTSTR lpszWindowTitle = N ...

  9. 如何使用 VLD 检测程序中的内存泄漏?

    下载地址:https://kinddragon.github.io/vld/ 下载 windows 安装包,进行安装即可,它会给你设置好 vs 的环境变量,使用时,直接在 vs ide 中包含即可. ...

随机推荐

  1. PullToRefresh 下拉刷新的样式修改

    资源文件结构图, 先看看下拉刷新头的布局, <?xml version="1.0" encoding="utf-8"?> <merge xml ...

  2. ACM题目————士兵杀敌(四)

    描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的 人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上, ...

  3. Java与.NET 的Web Services相互调用

    一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...

  4. JQuery知识快览之二—事件

    事件是脚本语言的核心.本文将为大家介绍JQuery支持的一些事件和如何自定义事件 JQuery内置事件 1.Document加载事件 JQuery提供了ready,load,unload三个Docum ...

  5. Java学习之路(二)

    什么是变量? 1:计算机是一种嫉妒精确的机器 2:要将信息存储在计算机当中,就必须指明信息存储的位置和所需的内存空间: 3:在Java当中 使用声明语句来完成上述任务 变量的类型:

  6. c#中委托和事件(续)(转)

    本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...

  7. 实现LUT

    //实现LUT 查找表 #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp& ...

  8. python INFO: Can't locate Tcl/Tk libs and/or headers

    安装opencv的时候遇到这个错误: python INFO: Can't locate Tcl/Tk libs and/or headers 参考如下文章解决这个问题: http://www.ver ...

  9. zoj Treasure Hunt IV

    Treasure Hunt IV Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is exploring the wonderland ...

  10. Web的Ajax应用开发模式(一)——了解Ajax的使用形式

    寄语: 前天在查看一些公司的招聘要求时,看到有公司要求测试人员了解Ajax,故写此博文旨在帮助测试人员提高自身技术知识水平,愿与广大测试同胞共同进步.(欢迎纠错!!!) 图1: 图2: