A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© import 中级黑马   /  2015-3-8 16:11  /  1117 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

堆与栈,堆是先进先出的队列,栈是先进后出的队列。我怎么知道程序里面的东西,哪些是保存在堆段,哪些是保存在栈段呢?

3 个回复

倒序浏览
自顶一下。看视频感觉挺简单,但是东西一多,有些乱
回复 使用道具 举报
栈内存和堆内存是内存里面的概念   而堆栈的后进先出是就堆栈这种数据结构而言的   两者是完全不同的概念   栈内存存放的是变量,程序结束后这些变量就消失   而堆内存存放的是类和对象程序结束后一般不会自动消失(就OC而言)这是需要通过内存管理来回收那些垃圾对象
回复 使用道具 举报
以下是自己结合以前笔记的理解,欢迎纠正:
要明确这个问题,首先要明确程序运行时,系统内存的分配情况(虚拟内存):
这里说个大概,主要是堆和栈:(略去了系统的一些信息)
---------------------- 用户栈 ---------------------------
                                       |
                                       |              向下
                                       |
----------------共享库存储器映射区域------------------
                                       |
                                       |               向上
                                       |
----------------------运行时堆--------------------------                                                      
                             未初始化的数据(.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命令进行查看相应段的内容。
非静态的局部变量在运行时在栈里分配,全局变量和静态的局部变量存放在静态数据存储区。
而堆只能通过用户自己手动申请才能分配。


评分

参与人数 1技术分 +1 收起 理由
Micro + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马