c 中棧和堆的問題

2022-04-04 04:28:23 字數 541 閱讀 5105

1樓:果建翼

你應該去看看作業系統原理。。

windows是分時作業系統,如果是單核cpu的話一個時候只能執行一個程式,其它程式處於掛起狀態。windows將cpu的執行時間劃分為許多個很小的時間片,然後讓這些程式輪換使用。因為輪換的非常快,在你看來就像是同時執行了多個程式一樣。

因此你的疑問就很好回答了,系統為每個程序劃分了獨立的地址空間,為每個程序建立了單獨的棧,同一時間ss肯定只能儲存一個棧地址,就是當前正在執行的程式的棧地址,其它程式處於掛起狀態,其棧地址被儲存在其它地方,切換的時候再讀回來。(說到intel的超執行緒技術,其實就是為一個cpu配置了多套暫存器,這樣另外一個程式的暫存器資料在切換的時候就不需要儲存和讀取,加快了切換效率)

堆是另外一個完全不一樣的東西,相對而言堆是很上層的結構,cpu底層並沒有為堆專門設立暫存器或其它結構,堆都是由作業系統和c執行時**負責維護的。

2樓:匿名使用者

你所說的堆疊可能跟c++的有點不一樣...

c++堆疊的概念比較抽象,只是某個記憶體區,但又並不具體。

簡述堆和棧的區別和聯絡,堆和棧的區別是啥

一 預備知識 程式的記憶體分配 一個由c c 編譯的程式佔用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...

資料結構中的順序棧的進棧和出棧問題

include define stacksize 100typedef char datatype typedef struct seqstack void initstack seqstack s int stackempty seqstack s int stackfull seqstack s...

關於資料結構c語言鏈棧的問題

你的while迴圈寫錯了,你想借助s遍歷,但是迴圈條件用的還是top,而top在迴圈內部沒有修改,所以專就進入死循屬環了,應該這麼改 while s null 用s 還有,print函式應該是不想修改鏈棧的吧,只是讀取。所以引數就不要用a的地址了,直接用a傳遞就行了,保證函式體內不會意外修改a。函式...