请问一个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).这几个是在哪里面的?

局部变量都在 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。

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

计算机系统里,堆多栈少,栈要存放快速访问(static)、系统分配的空间(computer Name),堆要存放用户自己分配的空间(如new和malloc)
int v, --------------------------栈
Node *n, ---------------------堆(指针指向的空间)
Node *next, ------------------堆(指针指向的空间)
int value, ---------------------栈
int numberElements,---------栈
Node *head, -----------------堆(指针指向的空间)
int i, --------------------------栈
int x, -------------------------栈
new Node(x, head)----------堆