浅谈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语言中数据的存储分为哪些 ...
随机推荐
- iOS UITableView 修改滚动条颜色 默认选中第一条
//隐藏 self.tableView.showsVerticalScrollIndicator = NO; //修改颜色 self.tableView.indicatorStyle=UIScroll ...
- Java Web的数据库操作(一)
一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序与 ...
- Qt 格式化字符串
Qt字符串格式化性能比较 Qt字符串格式方法有三种, QString::arg(), QString::sprinft()和QStringList::join().今天我做了个简单的性能测试, 希望对 ...
- SVN 代码下载,上传
代码下载,如: svn co https://99.99.16.1:8080/svn/pavenas/webpy --username bg 代码上传,如: svn commit -m "备 ...
- (转)在Repeater中嵌套使用Repeater
在一般的网站中浏览类别的用户控件通常都位于大多数 ASP.NET 页的左边,它使用户能够按类别快速的查找产品.最近遇到一个客户,因为在他网站上展示的产品并不多,所以要求在原有类别浏览的基础上将产品也加 ...
- Android WiFiDirect 学习(二)——Service Discovery
Service Discovery 简介 在Android WifiDirect学习(一 )中,简单介绍了如何使用WifiDirect进行搜索——连接——传输. 这样会有一个问题,那就是你会搜索到到附 ...
- C3P0连接池配置方式
c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...
- How to start the Virtualbox VMs under terminal
Since we have servral machine on my testbed(fedora), and if I need start some VMs on that, I have to ...
- NSUserDefaults的使用方法
NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等,用户再次打开程序或开机后这些数据仍然存在.默认系统允许应用程序自定义它的行为去迎合用户的喜好.你可以在程序运行的时 ...
- js 日期控件 可以显示为和历
日期控件的js <!-- /** * Calendar * @param beginYear 1990 * @param endYear 2010 * @param language 0(zh_ ...