區域性變數的指標都在棧中,那堆中能否有指標?

時間 2021-06-01 09:58:13

1樓:

問題的第一句錯了, 是區域性變數通常儲存在棧中. 或者說, 指向區域性變數的指標, 對應的位址在棧裡.

所以問題可以改為"區域性變數在棧中, 那堆中能否有變數?"

變數可以儲存在堆裡, 如何實現: 用malloc分配等量的記憶體,並使用它儲存物件(將malloc的返回值void*, 型別轉換為變數型別) 並初手動始化, 或者常規的new (C++語言,會自動呼叫建構函式).

PS. C語言本身沒有棧/堆的概念, 只規定了變數的生命週期和行為. 是不是要用棧,是implementation-defined.

第一種變數是auto storage(自動儲存), 第二種是allocated storage.

只不過auto變數的生存行為, 非常適合用棧儲存而且大部分(所有?)編譯器都使用棧. 而allocated storage就是用記憶體管理函式,分配出的儲存空間,編譯器通常用堆來管理.

(感覺繞起來好累,I hate lawyers.)

2樓:巭閄

指標是儲存乙個物件位址的物件,大小一般是虛擬記憶體位址的大小棧是一種資料結構後進先出

為了方便編譯器實現函式呼叫 cpu內部實現了棧這個資料結構編譯器為每次函式呼叫構建了一幀資料裡面包含了呼叫引數引數返回位址原來的棧頂位置和區域性變數這個資料結構叫棧幀

每次呼叫棧幀入棧每次函式返回棧頂出棧用棧幀的呼叫位址和原來的棧頂位置恢復上層函式的狀態

堆是語言執行時環境構建的通過作業系統批量分配記憶體頁補充空間然後使用記憶體分配器來管理這些記憶體空間作業系統的記憶體管理粒度是頁因為MMU管理記憶體的時候無法對每乙個位元組分配許可權和對映關係 (資料量太大)

3樓:Leslie chin

我的專欄哈哈哈,,打擾啦。

當然可以來,別怕指標這玩意,指標也就是個變數啊,變數怎麼就不能放到堆裡面了?

在早期的C指標就是用乙個32bit的整數來儲存的,你可以把指標當作乙個整數來看,把這個指標(整數)存在堆裡面就完了啊。

一般我們要存在堆都是用malloc,

可以這樣啊:

char **s;

s = (char **)malloc(sizeof(char *)*100);//這裡不就是申請了100個(char *)的空間放堆麼?

for (int i = 0 ; i < 100; i++){

s + i) = (char *)malloc(sizeof(char) * 100);

4樓:宅學部落-王利濤

堆記憶體都是匿名訪問的,對這塊記憶體的操作需要程式設計師自己管理,編譯器不會搭理這塊記憶體的,因此不能在堆中定義乙個指標變數。

當然,你可以在堆中申請一塊記憶體,然後裡面存放的都是指標(位址),但是又有什麼意義呢,把簡單問題都複雜化了。

5樓:

指標是變數,沒有定義這個變數就不存在變數的指標。就算定義了,這個指標也是臨時繫結給乙個變數,不能說區域性變數的指標。

所以你這個問題的表述就有問題。至於在不在棧中,更是跟它繫結的變數毫無關係。

指標和區域性變數的效率有很大的差異嗎?

Zhensheng Yuan 你們放開這題目!讓我來!第乙個問題 前者兩個區域性變數,後者乙個,所以前者的確是使用了更多儲存空間。第二個問題 首先,訪問效率最高的是暫存器,其次是CPU內建的快取,再之主存,即物理記憶體。dobule h high是區域性變數,而且函式內區域性變數數量少,很明顯兩者的...

c 中能否判斷乙個指標指向棧還是堆?

Rico 如果假定指標非堆即棧,不考慮 code bss mmap 這些段位址的話,應該是可以的。提供乙個思路 1 讀取暫存器狀態 2 通過 rbp ebp 回溯堆疊,找到頂級堆疊的 ebp,也就是整個程序 執行緒 的堆疊起始位址 3 使用指標位址與堆疊起始位址比較,差值與平台相關的最大堆疊size...

計算機中的堆位址從低到高向上增長,但棧位址卻從高到低向下增長,為什麼這樣設計,這樣設計有什麼好處?

我的理解是,入棧從高位址向低位址增長,這是資料的儲存階段 出棧是從地位址向高位址進行的,這是資料的讀取階段。從資料訪問這個層次來看,堆和棧都是從低位址開始的,沒什麼不同,也比較符合常理。 浮生 正好看到Cortex M3的相關文件,在Cortex M3中,堆和棧就是這麼設計的。這樣設計的目的是當棧不...