所謂的棧就是一種先入後出的規則。對於資料結構,棧是一種對元素的訪問實現了先入後出規則的結構,即只能透過push和pop來對其中的元素進行訪問。對於記憶體中的棧,則是針對“棧幀”而言實現的先入後出,每個棧幀保儲存當前函式的區域性變數、上一個棧幀的地址等資訊,用來實現函式呼叫過程,即呼叫一個函式就push一個棧幀,函式退出就pop一個棧幀。棧幀的概念可以去好好看一下。對於每個函式,其區域性變數只在當前函式中使用,所以放在棧幀中最合適不過了。當然,編譯器的實現也是可以選擇不把區域性變數放在棧幀中,而採取其他的實現方式,但那樣又有什麼好處呢?存放在棧幀中的資料當然是要被訪問的,而這種訪問方式恰好就是棧幀指標加上一個偏移量就可以。而這種訪問資料的方式,從棧幀的角度上來說,並不意味著打破了棧的先入後出的訪問規則。因為此時的push和pop,實際上是對於一整個棧幀而言的,而並非棧幀中的資料。總結一下記憶體中的棧,之所以被稱之為棧,是因為對於棧幀而言,其實現了push和pop的操作。當然這種操作是由編譯器維護,用來實現函式呼叫的。對於題主的描述『難道記憶體棧的push就是定個初值再開個空間,然後之後裡面的值就讓程式隨便訪問,隨便改嗎。』,其實就是呼叫函式時push了一個棧幀,裡面的資料也確實是由當前函式來訪問的。
所謂的棧就是一種先入後出的規則。對於資料結構,棧是一種對元素的訪問實現了先入後出規則的結構,即只能透過push和pop來對其中的元素進行訪問。對於記憶體中的棧,則是針對“棧幀”而言實現的先入後出,每個棧幀保儲存當前函式的區域性變數、上一個棧幀的地址等資訊,用來實現函式呼叫過程,即呼叫一個函式就push一個棧幀,函式退出就pop一個棧幀。棧幀的概念可以去好好看一下。對於每個函式,其區域性變數只在當前函式中使用,所以放在棧幀中最合適不過了。當然,編譯器的實現也是可以選擇不把區域性變數放在棧幀中,而採取其他的實現方式,但那樣又有什麼好處呢?存放在棧幀中的資料當然是要被訪問的,而這種訪問方式恰好就是棧幀指標加上一個偏移量就可以。而這種訪問資料的方式,從棧幀的角度上來說,並不意味著打破了棧的先入後出的訪問規則。因為此時的push和pop,實際上是對於一整個棧幀而言的,而並非棧幀中的資料。總結一下記憶體中的棧,之所以被稱之為棧,是因為對於棧幀而言,其實現了push和pop的操作。當然這種操作是由編譯器維護,用來實現函式呼叫的。對於題主的描述『難道記憶體棧的push就是定個初值再開個空間,然後之後裡面的值就讓程式隨便訪問,隨便改嗎。』,其實就是呼叫函式時push了一個棧幀,裡面的資料也確實是由當前函式來訪問的。