簡體   English   中英

c中全局變量和堆變量的區別和相似之處是什么?

[英]What are the differences and similarities between global variables and heap variables in c?

c中全局變量和堆變量的區別和相似之處是什么?

假設我有這段代碼。

const char* globalVar = "This is a string";

int main(int argc, char* argv[]){
    char* heapVar = malloc(7 * sizeof(char));
}

那么 globalVar 和 heapVar 有什么區別和相似之處呢?

提前致謝。

全局變量和堆變量是兩個不同的概念。 堆變量只是告訴你變量的空間被分配到哪里,而全局變量告訴你變量的范圍。

全局意味着變量對任何東西都是可見的,它與局部相反,這意味着變量的可見性受到限制。

堆意味着變量(指針)是動態分配的(例如:使用 malloc),並且與未動態分配變量的堆棧相反。

所以你可以有一個全局堆變量、一個全局堆棧變量、一個局部堆變量或一個局部堆棧變量。

在您的情況下, globalVar 是全局的,因為它是在任何函數的范圍(大括號)之外聲明的,而 heapVar 是 main 的局部變量。 由於調用了 malloc,heapVar 在堆上聲明。 globalVar 是一個特例,因為它使用 char* 聲明。

有關如何處理 char* 樣式聲明的更多詳細信息,請參閱: 堆還是堆棧? 在 C++ 中的函數調用中引用常量字符串時

全局變量始終存在,永遠不會消失。 此外,它在該文件/模塊中的所有函數中都是可見的,除非聲明為“靜態”,否則它在整個文件/模塊中也是可見的。

請注意,您的全局變量不是“這是一個字符串”,而只是那個 globalVariable,它只是一個指針(包含內存中的地址)。

heapVar 變量包含指向堆上某物的地址。 該變量僅在 main() 函數內部可見。

可以使全局變量指向堆。

這里的區別在於 globalVariable 指向的內容是靜態分配的,而 heapVar 指向的內容是動態分配的(可以通過調用 free() 和釋放內存來銷毀它,而不能釋放該字符串使用的內存“這是一個string”,這是 globalVar 指向的內容)。

注意:這里我談論的是 globarVar 和 heapVar,而不是它們指向的內存。
區別在於:

范圍

heapVar 在堆棧中,而不是在 heap 中,所以它的作用域是它的函數的本地范圍,並且 globarVar 在任何地方都可以評估。

人生

heapVar 在函數調用結束時終止,globarVar 在程序的所有持續時間內都存在。

關於他們指向的內存:

heapVar 指向的內存在堆中,globarVar 指向的內存在實現定義的只讀內存中,為了安全起見,將其設為const char*:

char* globalVar = "This is a string";

堆中的內存可以隨時釋放,文字字符串在程序的整個持續時間內都存在。 在你的情況下你有泄漏。無論如何我明白這只是一個例子,也許你知道它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM