2015-12-20 55 views
11

我想問C變量是如何存儲在C中的?如何在C中存儲一個變量名?

更明確考慮下面的代碼:

int main() { 
    int a = 1, b; 
    b = a + 2; 
    return 0; 
} 

例如這裏變量地方的什麼內存C存儲的名稱。

例如,如果&a=0x12A7(假設)&b=0x123B1,那麼如何以及在何處並在其內存名稱a存儲存儲變量名是怎樣的?

回答

12

C不存儲變量的名稱。它的編譯器將變量的名稱存儲在編譯器的符號表中。
該數據結構由編譯器創建和維護。
符號表的example的片段

// Declare an external function 
extern double bar(double x); 

// Define a public function 
double foo(int count) 
{ 
    double sum = 0.0; 

    // Sum all the values bar(1) to bar(count) 
    for (int i = 1; i <= count; i++) 
     sum += bar((double) i); 
    return sum; 
} 

可能至少包含以下符號:

enter image description here

+3

符號表是一個編譯時結構,它不反映運行時屬性。地圖文件和調試信息可用來獲取位置符號名稱的想法,但它們並不是要在程序中使用..RTTI和其他形式的內省,但C沒有任何形式的內容 –

18

根本不需要存儲變量名!編譯器可以完全擺脫它們。試想一下,如果編譯器是相當聰明,它可以在你的整個程序減少到這一點:

int main(){ 
    return 0; 
} 

注意,此計劃的效果是完全一樣的原始的,現在也有完全沒有變數!現在不需要命名,是嗎?

即使您的代碼中的變量已被實際使用,但在編寫程序時,它們的名稱純粹是方便的符號,但處理器在執行代碼時不需要它們。至於微處理器而言,這樣的功能:

int foo(int x, int y) { 
    int z = x + y; 
    return z * 2; 
} 

可能會導致編譯代碼,這樣做,在一些假設簡單的指令集架構(ISA):

ADD # consumes top two values on stack (x and y), pushes result (z) 
PUSH 2 # pushes 2 on stack 
MULT # consumes top two values on stack (z and 2), pushes result 
RET 

較長的故事有時爲了調試目的而存儲變量名稱。例如,如果您使用的是GCC,則可以通過-g選項發出一個「符號表」,其中包含諸如用於調試的變量名稱等內容。但它不是簡單地運行一個程序所需要的,它不被語言標準所覆蓋 - 它是一個隨平臺而異的實現功能。

+0

好的我有一些想法 –

-1

好第一關,如果你只是使用C這讓你的腦袋上海峽是從哪裏開始的: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

但是這比你的問題更實用。爲了回答這個問題,我們首先問爲什麼變量有地址這裏是爲什麼是堆棧。對於一個操作程序來說,返回調用必須指向適當的緩衝區,這樣所有的部分都按照設計完成。現在,我認爲是原始問題,即實際地址是如何決定的,因爲答案是您必須瞭解處理器如何實現堆。

https://en.wikipedia.org/wiki/Memory_management

「自分配的精確位置不是預先已知的,存儲器被間接地訪問,通常通過指針參考。用於組織的存儲器區域和分配的特定算法和解除分配塊是相通與內核......」

讓我們回到事物的實際側與抽象的指針:

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

希望這個給你一個更清晰的畫面:)

快樂編碼。

相關問題