2015-11-26 128 views
7

在C99,下面的代碼行創建堆棧的變量的ptr指向在堆上的存儲器區域。棧和堆在編程語言

int *ptr = (int*)malloc(sizeof(int)*10); 

堆棧和堆的定義在哪裏?我無法在C99語言規範中找到它們。

堆棧和堆棧是由操作系統還是指令集架構定義的?

另一個相關的問題是,C#中堆棧和堆的概念是否與C99中的概念完全相同?由於C#代碼在.Net框架上運行,我不確定這個概念是否與C99相同。

+0

這將部分地幫助你。有一個很好的答案。 http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – niksofteng

+0

感謝您的信息。但主要問題是定義在哪裏? – mingpepe

+0

在C中,「堆棧」和「堆」是口語化的。 – immibis

回答

1

堆是被分配給在所述計算機上運行的給定過程的存儲器的量。堆棧通常分配給當前在給定進程上運行的線程的內存量較小。

當你創建一個局部變量,它存儲到堆棧中。這種內存選擇被稱爲堆棧,因爲它處理作用域時,不同的值被從可尋址空間中推出或彈出,就像使用堆棧數據結構一樣。

然後,當你malloc一個變量它被存儲到堆,因此保存,甚至跨多個範圍。

請注意,堆中存儲的內容必須在完成使用時釋放,而操作系統會自動處理該內容。

結賬http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

6

棧和堆是實施細節;就像你發現的那樣,C語言的定義根本沒有提及它們。

C語言定義講述了存儲持續時間的對象。具有auto存儲時間的對象的生命週期延伸到它們的封閉塊;硬件堆棧使得該行爲易於實現,所以幾乎所有C實現都這樣做。具有allocated存儲持續時間的對象具有從malloc/calloc/realloc呼叫延伸到致電free的延續時間。同樣,幾乎所有的C實現都利用系統堆來實現這種行爲。

但是,實施並不具有具有以使用系統提供的堆棧或堆以滿足對象存儲持續時間要求;這只是一個更多的工作。

+0

什麼是系統提供的堆棧或堆?從硬件角度來看,它們是一回事嗎?那麼它們是由操作系統定義的嗎? – mingpepe

+0

@mingpepe - 堆棧通常由硬件平臺定義(我熟悉的大多數CPU都會使用幾個寄存器堆棧管理)。堆硬件和操作系統之間混合使用。實現不同。 –

+0

堆硬件和操作系統之間的混合是什麼意思? – mingpepe