我们写了这么多年的程序猿。可能理论方面还比不上大学生。有人 "嘘"我了,假设有能回答下面几个问题的同学请举手:

1.面试常常遇到:同学请说说堆栈的差别?

2.同学请说说一个函数在堆栈中调用过程(首先要知道函数过程是保存在什么中的)。

3.静态变量、全局变量、局部变量、常量等哪些是保存在堆中,哪些是栈中。哪些是静态区域中。

事实上回答第一个我问题,第二和第三问题就是........还真有人举手。就算你举手了,我也要讲。有不正确的地方。这几位同学给我批评指正。



先来看图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRm9saXNoX0F1ZGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

就上图来看堆栈差别是.......非常明显堆比栈大。(别嘘),操作系统太高深此处省略,其他还有文字常量区、程序代码区。在其他我也不知道有什么此处省略。

我们专门来看看 栈、堆、静态存储区。准备好了吗?

什么是堆,什么是栈

堆--heap  栈--stack  最大的差别:一个四个字母。一个5个字母。

宏观上来说。栈是由系统提供的数据结果,而堆是由C/C++函数库提供的。

从这句话中我的推測理解是栈是系统提供和管理的,而堆是编程语言提供和管理的。在浓缩一下就是栈是自己主动管理的。而堆是手动管理的。

微观上来说。

堆栈就是一种方式,一种存储数据的方式或者一种数据结构。

看它的定义:栈是一种先进后出的线性表,仅仅要符合先进后出的原则的线性表都是栈。

而堆是一种二叉树,有最大推、最小堆,我们经常使用的什么冒泡、选择等能够用于堆排序。

总之浓缩一下:

栈是系统自己主动管理、採用先进后出方式存储数据的存储区域。

而堆是採用手动管理(malloc 和 free程序中创建、释放)、採用二叉树存储数据的存储区域。(特殊情况除外。比方栈也有动态分配和静态分配)

栈是一种先进后出的线性表,仅仅要符合先进后出的原则的线性表都是栈。

综上:栈的特点就是高速、高效、可是因为是机器读写,灵活性相对较弱。堆因为能够手动大小分配,较为灵活、使用面广泛,可是速度没有栈快。

堆栈差别

1、分配方式:自己主动、手动

2、速度、大小、响应速度:栈快、小,堆慢、大

3、数据存储方式:先进后出、二叉树

补充说明:静态存储区似乎给忘了,仅仅要记住一点静态存储区是用来存放全局变量和静态变量的。

程序中哪些是放在堆中、哪些是放到栈中

1、栈区(stack): 由编译器自己主动分配释放 。存放函数的參数值。局部变量的值等。其操作方式类似于数据结构中的栈。 

 比如,声明在函数中一个局部变量 int b; 系统自己主动在栈中为b开辟空间比如:声明在函数中一个局部变量 int b; 系统自己主动在栈中为b开辟空间

2、堆区(heap): 一般由程序猿分配释放, 若程序猿不释放,程序结束时可能由OS回收 。

须要程序猿自己申请。并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 在C++中用new运算符 如p2 = (char *)malloc(10); 可是注意p1、p2本身是在栈中的。比如:在c中malloc函数 

p1 = (char *)malloc(10); 

p1 = (char *)malloc(20); 

可是注意p1,p2本身是在栈中的。

到此我的推測----栈中存储的大部分是地址(还有写少许的局部变量值)。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域。 未初始化的全局变量和未初始化的静态变量在相邻的还有一块区域。 (程序结束后有系统释放 ,即生命周期)

4、文字常量区 —常量字符串就是放在这里的。

5、程序代码区—存放函数体的二进制代码。



程序说明:



int a = 0; //全局初始化区 

char *p1; //全局未初始化区

main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

函数调用过程

函数调用主要是在栈中进行的:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址。然后是函数的各个參数,在大多数的C编译器中。參数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈。然后是參数。最后栈顶指针指向最開始存的地址。也就是主函数中的下一条指令,程序由该点继续执行。

C内存管理一 概述的更多相关文章

  1. JVM内存管理------JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  2. JVM内存管理之JAVA语言的内存管理概述

    引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓 ...

  3. Cocos2d-x 3.2 的内存管理详解

    目标读者:了解 Cocos2d-x 中的节点以及节点树,了解引用计数,了解游戏主循环等概念. 本文首先介绍 Cocos2d-x 3.2 中内存管理的作用,以及各个作用的应用.借由通俗易懂的解释来了解内 ...

  4. Android异常与性能优化相关面试问题-内存管理面试问题详解

    内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...

  5. MongoDB源码概述——内存管理和存储引擎

    原文地址:http://creator.cnblogs.com/ 数据存储: 之前在介绍Journal的时候有说到为什么MongoDB会先把数据放入内存,而不是直接持久化到数据库存储文件,这与Mong ...

  6. 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

    http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...

  7. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  8. iPhone之IOS5内存管理(ARC技术概述)

    ARC(Automatic Reference Counting )技术概述 此文章由Tom翻译,首发于csdn的blog,任何人都可以转发,但是请保留原始链接和翻译者得名字.多谢! Automati ...

  9. linux2.6 内存管理——概述

    在紧接着相当长的篇幅中,都是围绕着Linux如何管理内存进行阐述,在内核中分配内存并不是一件非常容易的事情,因为在此过程中必须遵从内核特定的状态约束.linux内存管理建立在基本的分页机制基础上,在l ...

随机推荐

  1. CSS3特效——六面体

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Python3 定时访问网页

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50358695 如果我有一组网站,想要定 ...

  3. HDU 4329 Contest 3

    果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找 ...

  4. Sybase数据库工具DbVisualizer乱码问题

    使用DbVisualizer来操作sybase数据库的时候,会出现乱码问题,中文变成  '口口'. 解决的方法例如以下: 将这三个字体都改成 "宋体"  或者改成 "PM ...

  5. node 命令行输入控件 prompt.js

        function print(){ console.log.apply(console , arguments) } var step ,_lstStp ,_onConfirmInput ,_ ...

  6. javaScript中的事件对象event

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包括了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  7. kentico api

    http://devnet.kentico.com/docs/10_0/api/html/R_Project_Kentico_API.htm ScriptHelper.RegisterClientSc ...

  8. MongoDB数据操作之删除与游标处理

    删除数据(比较常用) 范例:清空infos集合中的内容.表.文档.成员. db.infos.remove({"url":/-/}); 默认情况下都删除,第二个条件设为true,只删 ...

  9. BZOJ 2127 二元关系

    题意: 思路: 先把所有的值加起来 最小割割哪儿 就代表那个地方不选 一减 剩下的就是 最大值了 //By SiriusRen #include <cstdio> #include < ...

  10. direct2d: antialiasing and drawing a line with a 1 pixel stroke

    http://xboxforums.create.msdn.com/forums/t/61448.aspx I'm currently porting a number of custom MFC C ...