堆疊是一個小的記憶體區域,在執行期間將臨時值放入其中。與堆分配相比,將資料分配到堆疊中的速度非常快,因為已經為此分配了所有記憶體。

int main() {
    int a = 0; //Stored on the stack
    return a;
}

堆疊的命名是因為函式呼叫鏈將其臨時記憶體堆疊在一起,每個記憶體使用一個單獨的小部分記憶體。

float bar() {
    //f will be placed on the stack after anything else
    float f = 2;
    return f;
}

double foo() {
    //d will be placed just after anything within main()
    double d = bar();
    return d;
}

int main() {
    //The stack has no user variables stored in it until foo() is called
    return (int)foo();
}

儲存在堆疊中的資料僅在分配變數的作用域仍處於活動狀態時才有效。

int* pA = nullptr;

void foo() {
    int b = *pA;
    pA = &b;
}

int main() {
    int a = 5;
    pA = &a;
    foo();
    //Undefined behavior, the value pointed to by pA is no longer in scope
    a = *pA;
}