黑马程序员技术交流社区

标题: 堆与栈 [打印本页]

作者: import    时间: 2015-3-8 16:11
标题: 堆与栈
堆与栈,堆是先进先出的队列,栈是先进后出的队列。我怎么知道程序里面的东西,哪些是保存在堆段,哪些是保存在栈段呢?
作者: import    时间: 2015-3-8 16:12
自顶一下。看视频感觉挺简单,但是东西一多,有些乱
作者: huhanze    时间: 2015-3-8 17:19
栈内存和堆内存是内存里面的概念   而堆栈的后进先出是就堆栈这种数据结构而言的   两者是完全不同的概念   栈内存存放的是变量,程序结束后这些变量就消失   而堆内存存放的是类和对象程序结束后一般不会自动消失(就OC而言)这是需要通过内存管理来回收那些垃圾对象
作者: tripleCC    时间: 2015-3-9 15:44
以下是自己结合以前笔记的理解,欢迎纠正:
要明确这个问题,首先要明确程序运行时,系统内存的分配情况(虚拟内存):
这里说个大概,主要是堆和栈:(略去了系统的一些信息)
---------------------- 用户栈 ---------------------------
                                       |
                                       |              向下
                                       |
----------------共享库存储器映射区域------------------
                                       |
                                       |               向上
                                       |
----------------------运行时堆--------------------------                                                      
                             未初始化的数据(.bss段)                     |静态数据存储区
                              已初始化数据(.data段)                   |静态数据存储区
                                 程序文件(text段)
-----------------------------------------------------------
现在来写一段程序:
#include <stdio.h>
// 下面三个全局变量
int a = 0;  // 已初始化的数据a,放在.data段
static int b1 = 0; // 同样是已初始化的静态数据,放在.data
int a; // 未初始化数据, 放在.bss段
static int b1;  // 未初始化静态数据, 放在.bss段
int main (void)
{
    test();
}
void test(void)
{
    static int c1 = 0; // 初始化的静态局部变量,存放在.data段
    static int c2; // 未初始化的静态局部变量,存放在.bss段
    int c3 = 0; // 存放在栈中
    char *c4  = malloc(10); // 申请堆中内存,也就是c4指向的内存
    /* 程序 */
}

综上:
以上的程序转换成机器码后存放在程序文件.text段。在MAC终端(UNIX系统即可)里可以通过readelf命令进行查看相应段的内容。
非静态的局部变量在运行时在栈里分配,全局变量和静态的局部变量存放在静态数据存储区。
而堆只能通过用户自己手动申请才能分配。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2