假設你知道在編譯時變量/指針的值是有此之間的任何差異;這C中全局變量和動態分配變量之間的區別是什麼?
int x = 5;
main(){
...
}
:
main(){
int *x = (int *) malloc(sizeof(int));
*x = 5;
...
}
我知道後者分配存儲器給堆和前者是堆棧,但是全局變量將存儲在整個程序的持續時間中,就像存儲在堆中的東西一樣。那麼這兩個代碼片段之間是否存在功能差異?
假設你知道在編譯時變量/指針的值是有此之間的任何差異;這C中全局變量和動態分配變量之間的區別是什麼?
int x = 5;
main(){
...
}
:
main(){
int *x = (int *) malloc(sizeof(int));
*x = 5;
...
}
我知道後者分配存儲器給堆和前者是堆棧,但是全局變量將存儲在整個程序的持續時間中,就像存儲在堆中的東西一樣。那麼這兩個代碼片段之間是否存在功能差異?
注意:在下面的所有評論中,我假設代碼是爲普通的日常平凡的現代臺式計算機編譯和運行的。
我知道後者受讓人存儲器到堆
真,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;
}
一個區別是變量的範圍。全局變量可以從程序中的任何函數訪問,而main()
中的指針變量只能從該函數訪問。要訪問它在另一個函數中引用的內存,它必須作爲參數傳遞給函數(或者變量的地址可以放入全局變量中)。
另一個區別是您可以更改指針變量指向的地址。
int *x = malloc(sizeof(int));
*x = 5;
int *y = x;
x = malloc(sizeof(int));
*x = 10; // *y still contains 5
您不能更改全局變量的位置,只能更改它的內容。
有區別嗎?我沒有看到任何相似之處(除了'x'名稱)。此外,第二個片段是非法的.. –
'main()'不再合法C. –
你可能想要一本C書。這不是輔導網站。你的**具體**問題是什麼,你是怎麼試着先找出自己的? – Olaf