2012-10-13 108 views
15

我保證之前已經詢問過這個問題,但是我一直沒能通過搜索找到它;提前抱歉,任何裁員。C數組實例化 - 堆棧還是堆分配?

這是我的(可能是錯誤的)理解,你只有在編譯時知道對象的大小時才分配給堆棧。因此,在初始化數組的情況下,你可以做其中之一(這應該進入堆疊):

char charArray[50]; 

由於該數組的大小在編譯時是已知的,這應該沒有問題。

在另一方面,這(我相信)也是有效的代碼:

char anotherCharArray[someVariable + 50]; 

這會進入堆疊呢?我很肯定代碼段錯誤,如果你釋放()這個,所以它讓我認爲它確實,但它對我來說並不合適。同樣,當數據通過malloc分配時,必須使用free()的唯一情況是100%嗎?

在此先感謝您的幫助。

+2

@Shookit:你需要指定你是在談論局部變量還是全局變量。 –

+0

@PaulR如果數組是可變長度的,它不能在全局範圍內。 – 2012-10-13 15:46:22

+1

您必須區分*自動存儲*和*堆棧*,這是存儲數據的低級方法。放置在自動存儲器中的數據也可以放置在其他地方,如寄存器中。在大小未知的本地數組(稱爲VLA:s)的情況下,編譯器可以將它放在堆棧上,也可以在堆上分配內存(只要它在合適的位置釋放它)。事實上,VLA與'setjmp' /'longjmp'不能很好地協同工作,因爲它們可能會泄漏(並且被C標準允許)。 – Lindydancer

回答

4

同樣,當數據是通過malloc分配時,必須使用free()的100%唯一情況?

是的。 (除了calloc和realloc之外,它們的返回值也是free()'d。類似的,有些函數使用malloc(),這個事實被記錄下來,例如strdup()-這些函數的返回值也是用來釋放的free(),很明顯。)

char anotherCharArray[someVariable + 50]; 

這會進入堆疊呢?

是的,它(在大多數實現 - 當然,這並不總是真正你承擔,但在大多數的平臺,它是)。是的,這是有效的代碼,但它只是C99的標準。

+0

好吧,所以看起來我最大的誤解是假設堆棧內存分配需要編譯時的大小知識嗎?我標記爲答案(但仍然可以自由回答我的評論:) – Shookit

+6

@Shookit是的,這是一個完全的誤解;具有已知大小與分配東西的位置無關。唯一的聯繫是,在以前的C版本中,出於各種歷史原因,'auto'變量必須具有已知的大小,並且只有'auto'變量可以分配到棧中。 –

+0

@JimBalter很好地回答了你的問題:) – 2012-10-18 11:00:35

7

如果char charArray[50];定義在文件範圍(所有函數之外)或者是static,它不會在堆棧上,它將在程序的啓動變量中預先分配一個全局。如果它不是static並且在函數作用域中定義,它將在堆棧中。

char anotherCharArray[someVariable + 50];只能在函數範圍內定義,並且要在堆棧上。

以上所有內容適用於C的典型實現。非典型的可以使用堆而不是堆棧,而不是程序的數據部分中的預先分配的空間。

您不要free()什麼沒有被分配與malloc()calloc()realloc()。簡單。一些功能可能意味着使用上述之一,例如, POSIX strdup()

+1

如果我們在全局範圍內,'char someArray [variableLenght];'不允許... – 2012-10-13 15:44:51

+0

@ H2CO3最近的編輯刪除了含糊不清的內容嗎?我沒有看到我在暗示全球範圍內允許這樣做的地方。 –