2014-02-21 37 views
0

只是感興趣。我正在修改我早已被遺忘的C的生鏽知識,並且想知道C在哪裏存儲聲明變量的標識符?C語言標識符在哪裏存儲

例如,如果我在main中聲明以下char值1。

int main(){ 
char value1 = 'A'; 
    return 0; 
} 

我知道char將被存儲在堆棧中的堆棧中。可以說,如果我們在value1上做了一個地址,就像這個& value1。我們會得到像0xF37012(一個假設的數字)。這將是價值所在的位置,但標識符如何?以及這與0xF37012關聯如何?它在主要的地方是在堆疊起重機嗎?或者是否所有的標識符都存儲在某個全局表或列表中?

+5

像'value1'這樣的名字是不需要的(因爲它是一個局部變量,而不是一個外部可見的名字),但是如果代碼是在啓用調試的情況下編譯的話,它們會保存在調試信息中。至少在程序鏈接之前,外部名稱(例如'main()')被保留,因爲鏈接器需要解析它們。 –

回答

4

除非您專門爲調試編譯,否則存儲的標識符爲而不是。如果您在編譯時設置了可調試性選項,則會有符號表與關聯函數/堆棧幀/靜態存儲提供這些映射。

+0

阿哈,這是完全有道理的。從這裏我推斷出所有變量實際上只是存儲位置,以我們的方便而命名。因此,當計算機推送值時,不會引用value1,而是0xF37012,並且假設得到的機器代碼將用0xF37012替換標識符value1的所有引用。很好,謝謝。乾淨利落。 –

+2

@AndrewS對於基本的理解是足夠正確的,但是請注意,如果函數是遞歸的,可能會有多個「value1」。 0xF37012將用於全局變量,但對於本地人來說,它更像(start_of_local_variables + 0x0056),並且start_of_local_variables可以爲每個函數調用改變。 – immibis

+1

而且,正如@ hurricane1026指出的那樣,如果編譯器的作用域不重疊,編譯器可以爲多個標識符重用一個地址(或地址範圍)。對於這個問題,編譯器可能完全優化內存引用,如果這些值可以保存在寄存器中足夠長的時間以在其他事物需要寄存器之前達到其目的。 – keshlam

0

某些標識符將在編譯時進行優化,除非生成調試信息。