2012-12-26 39 views
3

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

假設我有這段代碼。

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

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

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

在此先感謝。

+0

爲了安全起見,將其設置爲const char *,因爲您無法在該字符串上進行編寫。 –

+2

注意:你的'heapVar'實際上是一個自動(「堆棧」)變量,它指向**堆存儲。一旦main()返回或退出,'heapVar'不再存在,但*它所引用的對象*仍然存在。對於main(),這當然是一個小問題(如果是主返回,程序不應該存在,除了atexit處理程序),但對於「普通」函數來說,區別非常明確。並導致內存泄漏。 – wildplasser

+0

+1請注意,wildpasser說:heapVar指向堆存儲,但它在堆棧中。 –

回答

2

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

全局意味着變量對任何東西都是可見的,而它與局部變量相反意味着變量的可見性受到限制。堆意味着變量(指針)是動態分配的(例如:with malloc),並且與變量未被動態分配的堆棧相對。

因此,您可以擁有全局堆變量,全局堆棧變量,本地堆變量或本地堆棧變量。

在你的情況下,globalVar是全局的,因爲它是在任何函數的作用域(大括號)之外聲明的,而heapVar是main對本地的。由於調用malloc,heapVar在堆上被聲明。 globalVar是一個特例,因爲它使用了char *聲明。

有關的char *樣式聲明是如何處理的詳細信息,請參閱: Heap or Stack? When a constant string is referred in function call in C++

0

全局變量總是存在的,它永遠不會消失。更多的是,它在該文件/模塊中的所有功能中都可見,並且除非聲明爲「靜態」,否則它在整個文件/模塊中也是可見的。

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

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

可以使全局變量指向堆。

這裏的區別在於,globalVariable指向的內容是靜態分配的,而heapVar指向的內容是動態分配的(您可以通過調用free()和空閒內存來銷燬它,但不能釋放該字符串使用的內存「這是一個字符串」,這是globalVar指向的內容)。

0

NB:在這裏,我將討論globarVar和heapVar,而不是它們指向的內存。
的區別是:

範圍

heapVar在棧中,而不是在堆,所以它的範圍是本地到它的功能,globarVar是assessible任何地方。

的生活,當函數調用結束

heapVar死亡,globarVar靜物該程序的所有時間。

關於他們指向內存:

通過heapVar指出的內存是在堆中,而由globarVar指向的內存中定義只讀存儲器的實現,使其成爲爲const char *爲安全:

char* globalVar = "This is a string"; 

堆中的內存可以在任何時候被釋放,文本字符串在程序的所有持續時間內都有效。 在你的情況下,你有泄漏。無論如何,我明白,這只是一個例子,也許你意識到這一點。

相關問題