weixin_44647325 2020-09-07 14:30 采纳率: 20%
浏览 50

请问一个heap和stack的问题

自己对heap 和stack一直不是很理解。
能不能麻烦看看下面这题哪些变量是在heap里哪些是在stack里?

class Node {
    public:
        Node(int v, Node *n = NULL) { value = v; next = n; }

    private:
        Node *next;
        int value;
};

Node *createList(int numberElements) {
    Node *head = NULL;
    for (int i = 0; i < numberElements; i++) {
        int x;
        cin >> x;
        head = new Node(x, head);
    }
    return head;
}

int v, Node *n, Node *next, int value, int numberElements,
Node *head, int i, int x, new Node(x, head).这几个是在哪里面的?

  • 写回答

2条回答 默认 最新

  • threenewbee 2020-09-07 17:51
    关注

    局部变量都在 stack 里,之所以要有 stack,就是因为 c 语言允许函数递归。早期有些语言,比如 BASICA ,是不支持递归的。
    在允许递归的情况下,会出现什么问题?很明显就是局部变量需要好多套:
    int sum(int n)
    {
    if (n == 0) return 0;
    int m = n - 1;
    int r = n + sum(m);
    return rl
    }
    比如这么一个代码,当你调用
    sum(100)的时候,显然,你最多需要100个m和r,每一层调用都需要一套,并且在函数运行结束的时候自动释放。
    先调用的最后释放,最后调用的最先释放。
    用 stack 是最简单的。

    这是为什么要用 stack 的原因。

    那么为什么 new/malloc 的变量不用 stack,显然有两个原因
    一个是它们的申请释放的关系不是 FILO 的,另一个是它们占用的空间是不固定的。如果放在 stack 上,那么如果一块内存需要释放,必然需要等它申请之后申请的内存先释放了才能释放。显然这些就不适合 stack。

    你把这个原理理解了,再去看你的问题就很简单了。

    评论

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试