2016-09-23 22 views
-3

假設你知道在編譯時變量/指針的值是有此之間的任何差異;這C中全局變量和動態分配變量之間的區別是什麼?

int x = 5; 

main(){ 
    ... 
} 

main(){ 

    int *x = (int *) malloc(sizeof(int)); 
    *x = 5; 
    ... 
} 

我知道後者分配存儲器給堆和前者是堆棧,但是全局變量將存儲在整個程序的持續時間中,就像存儲在堆中的東西一樣。那麼這兩個代碼片段之間是否存在功能差異?

+5

有區別嗎?我沒有看到任何相似之處(除了'x'名稱)。此外,第二個片段是非法的.. –

+0

'main()'不再合法C. –

+2

你可能想要一本C書。這不是輔導網站。你的**具體**問題是什麼,你是怎麼試着先找出自己的? – Olaf

回答

2

注意:在下面的所有評論中,我假設代碼是爲普通的日常平凡的現代臺式計算機編譯和運行的。

我知道後者受讓人存儲器到堆

malloc從存儲器被稱爲堆的區域獲得的內存。

和前堆

,全局變量並不存儲在堆棧上。初始化的全局變量將其值存儲在可執行文件中。該值從可執行文件加載到data segment

而是一個全局變量將存儲通過了 程序

的持續時間。

爲存儲在從malloc得到的堆

,存儲器意願的東西可以用free被釋放。因此,存儲在堆中的項目可能是臨時的。他們不一定是「存儲通過了該計劃的持續時間」

從評論:

相似的是,你有一個變量存儲5個可用 全球通過了該方案。

,在第一個片段全局變量在整個程序可用。第二個片段中的指針位於main的本地,並且只有在指針作爲參數傳遞給這些函數時纔可用於其他函數。例如,以下內容不起作用(因爲foo無法訪問x)。

void foo(void) { 
    printf("%d\n", *x); 
} 

int main(void) { 
    int *x = malloc(sizeof(int)); 
    *x = 5; 
} 
3

一個區別是變量的範圍。全局變量可以從程序中的任何函數訪問,而main()中的指針變量只能從該函數訪問。要訪問它在另一個函數中引用的內存,它必須作爲參數傳遞給函數(或者變量的地址可以放入全局變量中)。

另一個區別是您可以更改指針變量指向的地址。

int *x = malloc(sizeof(int)); 
*x = 5; 
int *y = x; 
x = malloc(sizeof(int)); 
*x = 10; // *y still contains 5 

您不能更改全局變量的位置,只能更改它的內容。

相關問題