2013-04-30 68 views
2

我正在寫一些C代碼,當遇到一個方法時,我想知道參數變量存儲在內存中的位置。 我瞭解以下內容:參數變量存儲在內存中的位置?

全局變量 - >存儲在靜態

靜態varables的代碼段 - >

局部自動變量(inside方法) - >存儲在堆棧

本地上靜態變量 - >存儲在堆棧中

局部常量變量 - >存儲在堆棧中

假設我的假設是正確的。

但是參數變量存儲在哪裏?例如:int *(int x,char * c);

謝謝!

編輯: 我知道,當我malloc的東西,它被放置在堆上,但是說我取消引用指針來獲得在指針位置值,是也存儲在堆或者是現在在堆棧中?

+0

回答您的編輯:值仍然存儲在堆上。當你取消引用一個指針時,你觸發一個存儲器讀取訪問存儲在你的指針中的任何地址(無論是堆棧,堆等)。根據編譯器生成的機器碼,讀取值可能會臨時放置到CPU寄存器中以進行高效的進一步處理。 – 2013-04-30 16:59:02

回答

1

C,ITYM函數中沒有方法。

全局變量以及靜態變量都存儲在.data或.bss段(以下稱爲「數據段」)中。

本地靜態變量也存儲在數據段中。

函數的參數值也存儲在堆棧中,並在返回地址之前立即推送。

生活在堆棧上的所有東西(局部變量,參數等)也可以存在於寄存器中。這就是爲什麼C標準沒有明確規定在什麼地方存儲的地方。

0

函數參數(「參數」)根本不需要存儲。記住:C使用價值呼叫。一個值不需要存儲在內存中,它可以存放在一個寄存器中,或者它的值可以通過某種方式從程序狀態中得出結論。

例如,像strlen()或sin(),cos(),sqrt()這樣的庫函數可以用硬件實現。通過將對應於x的某些值存儲到特殊功能寄存器中,發出一個特殊功能指令並將結果提取出來,可以實現sin(x)可以實現。 (浮點硬件有時甚至有僞指令來以最好的精度表示例如Pi。Pi值永遠不會通過,只有指令「使用Pi/2」)

即使對於「正常」用戶定義的函數,參數也可以通過寄存器傳遞,多個參數可以將組合成一個大的註冊,甚至可以優化出來。

這是內聯函數最好的可見性,它們可以完全消失,因爲它們的功能與調用者的功能相結合。

當函數獲取其參數的地址時(例如int func(int arg) { int *p = &arg; }將強制arg獲得地址),情況會有所不同,但這種情況相對較少。

WRT標準:一個C函數有一個激活記錄。 (非標準人員可能會稱之爲「堆棧框架」)。該函數的行爲好像參數是其局部變量的一部分,並且一旦函數返回,它們就超出範圍。 他們如何得到他們的價值是完全不相干的,理論上甚至可以通過消息傳遞來完成。