2015-04-12 126 views
-2

我已經試過這樣的事情:定義全局變量在C局部變量

int globalvar=10; 

void print() 
{ 
    printf("%d \n",globalvar); 
} 

int main(){ 
    int globalvar=5; 
    printf("%d \n",globalvar); 
    print(); 
    while (1); 
    return 0; 
} 

,然後輸出就這樣

5  
10 

我的結論是C已創建本地實例主要是內部的「globalvar」,它的初始值是由printf輸出的值10。

我沒關係與這一點,但我弄糊塗了一些新的點:

  1. globalvar這是前主初始化應該有印花布程序的範圍與DS的同一個內存位置在這種情況下,在函數中本地定義了一個具有相同名稱的變量(ex:main)時會發生什麼?

  2. 第二個問題與鏈接器有關:鏈接器如何處理這兩個相同名稱的變量,以便它以執行的方式執行?

PS:downvoting的問題後,我想說,我真的搜索的問題,我沒有發現過類似的問題,我還以爲問一個問題一樣,這將是對別人有用。 我希望我不是misunderstod

+3

您是_shadowing_範圍內的變量名稱。編譯器應該警告你這個,所有的警告級別。 –

回答

7

我的結論是C已創建「globalvar」內主要的本地實例,它與由printf的打印輸出值10初始化。

不,創建了一個名爲globalvar初始化爲5.然後,在printf使用它的局部變量。 print()不知道在所有有關的變量,並使用全球一組以10

這是什麼在這種情況下發生的,其中有一個與它同名的函數局部定義的變量(例如:主) ,?

局部變量優先。如果你想使用全局變量,你應該命名你的局部變量有些不同,所以它不會發生衝突。

這些都在同一個文件中,所以鏈接器根本不處理這兩個變量的相互作用。

+0

我意識到還有很多比這更多,但更好的是在這裏我不想深入細節。 –

+0

我想問一個更多的細節:globalvar在堆棧中(如果是本地的)和數據段(在全局的情況下)定義, 所以說優先級始終是給定的堆棧? –

+1

@MohamedElShenawy技術上可以,但我不認爲這是考慮它的正確方法,因爲範圍也適用於堆棧 - 您可以在堆棧中使用兩個具有相同名稱的變量。編譯後的程序也不會使用「名稱」,只是地址和存儲位置 - 因此變量是否具有相同的名稱或不同的名稱並不重要。 –

1

首先調用main中的printf。它輸出5 - 在main中定義的局部變量的值。

然後調用print,它調用printf輸出全局變量的值。

鏈接器沒有什麼可擔心的 - 它根本不處理局部變量,它們不能從它們聲明的函數外部通過名稱訪問,所以局部變量的名稱通常甚至不可見鏈接器。

1

你的本地變量會覆蓋函數內部的全局變量。局部變量的作用域將盡快結束函數的作用域。所以如果你調用另一個沒有同名變量的函數,你可以看到全局變量的值。

鏈接器在此功能中沒有任何作用。該功能由程序中的變量範圍管理。