2013-07-24 23 views
1

其實我剛開始學習C語言。我想知道在哪裏呢變量名獲得存儲在存儲器中C.請看下面的代碼:用於所有分配變量名稱的空間

int i = 10; 

我無法找到其中名爲「i」存儲在內存中。

+3

根本不存儲變量*名稱*。它可能存儲在調試符號中,但不存在於實時代碼中。唯一需要存儲的是變量本身。 –

+0

你認爲變量名和變量名有什麼區別嗎? – haccks

回答

2

取決於寫入行的位置。如果它在函數內部,那麼變量將具有自動存儲。這意味着它將在函數執行時存儲在堆棧中。當函數退出時不會存在。

如果它在「文件範圍」中,它將具有靜態存儲。並且在程序運行的整個過程中都會存在。

另外,弗拉德指出。如果編譯器檢測到它未被使用或具有恆定值,則可以優化變量。在這種情況下,它根本不會佔用任何空間。

請注意,我正在談論變量本身。名字不與程序一起存儲。本地代碼不需要變量名稱來訪問它,它只需要知道它所在的內存區域。

+1

恕我直言,還值得一提的是,變量可能完全由編譯器「優化」。 – 2013-07-24 13:40:41

+0

謝謝@VladLazarenko :) – StoryTeller

+1

-1:您直到bootnote纔回答問題。 –

1

在本地語言中,變量名稱不佔用任何空間。

+0

名稱不,變量。 – 2013-07-24 13:39:48

+0

@VladLazarenko:OP,詢問存儲在內存中的變量**名稱**。你讀過這個問題了嗎? –

+1

...你一般的意思是「低級編譯語言」。不知道「本地」甚至意味着什麼。 –

8

我試過很多知道在內存

做我店一般情況下,它不存儲在可執行的內存。

在程序鏈接^之前,字符串「i」被丟棄,目標代碼(對於這個特定的例子)減少到註冊訪問。

編譯器知道約i並保持它與此代碼使用的其他寄存器不同。

如果你想找到一些方式來獲得訪問該字符串,它可能是通過存儲與程序調試符號。不幸的是,訪問這些數據不適用於新手,並且不是特別便攜的。

^實際上,這隻有在您顯示的代碼位於本地範圍內時才爲真。在文件範圍內,字符串i被保留用於鏈接,並且只有鏈接器才能將其丟棄。

下面是我的編譯器提供的第一個中間輸出示例。我冒昧地將你的陳述放在當地的範圍內。包含****的行是我編譯器包含的註釋,以便將源與程序集關聯起來很容易。它們不被彙編程序使用(編譯中的下一個階段)。 i已被間接訪問%rbp所取代。

1:w.c   **** 
    2:w.c   **** int main() 
    3:w.c   **** { 
    9     .loc 1 3 0 
    10     .cfi_startproc 
    11 0000 55   pushq %rbp 
    12    .LCFI0: 
    13     .cfi_def_cfa_offset 16 
    14     .cfi_offset 6, -16 
    15 0001 4889E5  movq %rsp, %rbp 
    16    .LCFI1: 
    17     .cfi_def_cfa_register 6 
    4:w.c   ****  int i = 10; 
    18     .loc 1 4 0 
    19 0004 C745FC0A  movl $10, -4(%rbp) 
    19  000000 
    5:w.c   **** 
    6:w.c   ****  return 0; 
    20     .loc 1 6 0 
    21 000b B8000000  movl $0, %eax 
    21  00 
    7:w.c   **** } 

在後面的清單中我們可以看到i的調試符號。

55 004e 5F000000  .long 0x5f 
    56 0052 03   .uleb128 0x3 
    57 0053 6900   .string "i" 
    58 0055 01   .byte 0x1 
    59 0056 04   .byte 0x4 
    60 0057 5F000000  .long 0x5f 
    61 005b 02   .byte 0x2 
+0

這正是OP必須要找的東西.... so +++++++++++ 1 :) – 0decimal0

3

的名字甚至沒有在你完成,編譯的程序存在。在源代碼中這只是一個方便的功能,可以讓人們閱讀。在那個階段,編譯後的二進制文件中找不到變量名稱—,它們已被複雜的糾纏指針和數字網絡所取代。