浅谈c语言程序为什么需要内存 栈又是什么?
。关于内存(程序的执行需要内存的支持)
()内存本身在物理上是硬件器件,由操作系统提供
()内存的管理最终由操作系统统一管理。为了能过便捷的管理内存(酒店管理房间 是不是分很多不同的类型和待遇呢),同样操作系统提供了多种的机制来让了多种机制来让我们应用程序使用内存。这些机制彼此不同,各自有各自的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限)、使用内存、释放内存(向操作系统归还这块内存的使用权限)。也就是在进入酒店拿到钥匙或者卡,然后就可以进入一个编号为XX的房间,也就是你此时有临时的使用权限比如为一晚,第二天时间一到你就的归还钥匙或者卡,也就是释放内存。
。C语言能够获取内存的三种方式:
栈 堆 数据区
。关于栈
spec1:
运行的时候自动分配而且自动回收,程序员不用人工的去干预
spec2:反复使用
栈内存在程序中就是一块空间 程序反复使用这块空间
spec3:脏内存
为啥是脏的呢,反复使用,使用了就算了还不去清理,操作系统也不会帮你打理,哪有大哥给你做饭还洗碗的。因此分配到的时候保留的是原来的值,所以啊,变量定义最好初始化,不然出事儿都不知道啥情况
spec4:临时的(函数不能返回栈变量的指针,因为这个空间是临时的,注意了,很多时候我们想得到变量的地址,取出来用指针指向它,然后操纵它,但是这个之后,一旦其他的函数因为也是在栈中,很有可能就会取代刚才那块空间,这样就得不到理想的结果)
程序一执行完,你达到了目的,你就可以走了,让给其他的人也可以用这块空间。看看,多么人性化 #include <stdio.h> // 函数不能返回函数内部局部变量的地址,因为这个函数执行完返回后这个局部变量已经不在了
// 这个局部变量是分配在栈上的,虽然不在了但是栈内存还在还可以访问,但是访问时实际上这个
// 内存地址已经和当时那个变量无关了。
int *func(void)
{
int a = ; // a是局部变量,分配在栈上又叫栈变量,又叫临时变量
printf("&a = %p\n", &a);
return &a;
} void func2(void)
{
int a = ;
int b = ;
int c = ;
printf("in func2, &a = %p\n", &a);
} void stack_overflow(void)
{
int a[] = {};
a[-] = ;
} void stack_overflow2(void)
{
int a = ;
stack_overflow2();
} int main(void)
{
//stack_overflow();
stack_overflow2();
/*
int *p = NULL;
p = func();
func2();
func2();
printf("p = %p\n", p); printf("*p = %d.\n", *p); // 证明栈内存完了后是脏的
*/
return ;
}
学习笔记,嘻嘻,感觉不错。勿喷~~
浅谈c语言程序为什么需要内存 栈又是什么?的更多相关文章
- 浅谈C语言内存管理、内存泄露、堆栈
1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成. BSS段:BSS段 ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 浅谈Java语言环境搭建-JDK8
title: 浅谈Java语言环境搭建-JDK8 blog: CSDN data: Java学习路线及视频 1.What's the JDK,JRE JDK(Java Development Kit ...
- 【ASP.NET MVC系列】浅谈ASP.NET 程序发布过程
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 浅谈Spark应用程序的性能调优
浅谈Spark应用程序的性能调优 :http://geek.csdn.net/news/detail/51819 下面列出的这些API会导致Shuffle操作,是数据倾斜可能发生的关键点所在 1. g ...
- 浅谈C语言中断处理机制
一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...
- 浅谈c语言结构体
对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...
- 浅谈微信小程序对于房地产行业的影响
前几日,我们曾经整理过一篇文章是关于微信小程序对于在线旅游业的影响的一些反思(浅谈微信小程序对OTA在线旅游市场的影响),近日由于生活工作的需要走访了一些房地产的住宅商品房,突然想到微信小程序对于房地 ...
- 浅谈C语言的数据存储(一)
作者:冯老师,华清远见嵌入式学院讲师. 程序由指令和数据组成,C语言程序亦是如此.开发者在编写程序的时候往往需要根据不同数据的特点以及程序需求来选择不同的数据存储方式,那么在C语言中数据的存储分为哪些 ...
随机推荐
- Face recognition using Histograms of Oriented Gradients
Face recognition using Histograms of Oriented Gradients 这篇论文的主要内容是将Hog算子应用到人脸识别上. 转载请注明:http://blog. ...
- PHP字符串的编码问题(转)
大家都知道,不同字符编码,其在内存占用的字节数不一样.如ASCII编码字符占用1个字节,UTF-8编码的中文字符是3字节,GBK为2个字节. PHP 也自带几种字符串截取函数,其中常用到的就是 s ...
- wpf 中自定义控件及其使用
主要有3个步骤: 1. 首先创建一个自定义的控件,该控件继承 TextBox namespace EzIntePark.Presentation.Common { /// <summary> ...
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- 【转】asp.net 利用Global.asax 捕获整个解决方案中的异常错误
之前做项目的时候都是在每个页面中处理这不同的异常信息,一个页面数下来,很多个try{}catch{}语句块,令整个代码结构有些不够美观. 今天看到一篇帖子,是关于利用全局应用程序类来帮忙获取异常信息, ...
- C复习手记(Day4)
1.C错误处理 errno.perror() 和sterror() perror() 函数显示您传给它的字符串,后跟一个冒号.一个空格和当前 errno 值的文本表示形式. strerror() 函数 ...
- Ajax从服务器端获取数据---原生态Ajax
写在前面的话 Ajax从服务器获取的数据都是字符串,但是通过不同的解析,可以解析为XML或JSON来进行应用. 一般来说.使用XML格式的数据比较通用,但是服务器和客户端解析起来都比较复杂一些;而使用 ...
- 使用DataSet数据集插入记录
使用INSERT语句能够完成数据插入,使用DataSet对象也可以完成数据插入.为了将数据库的数据填充到DataSet中,则必须先使用DataAdapter对象的方法实现填充,当数据填充完成后,开发人 ...
- Floyed算法 最短路径
#include<iostream>#include<cstdio>int v,e,n; //v是顶点数,e是条数int v1[101][101],path[101][101] ...