2015-04-24 98 views
-1

動態存儲器分配/ C++發生通過malloc和靜態存儲器分配例如:int a[3];其在執行代碼之後分配。C/C++動態或靜態內存分配?用C

但這碼int x[y+1];只能值歸因於Y後發生,這種情況發生在執行時間,所以它的靜態,動態或兩者兼而有之?編譯器是否會自動在機器碼中插入一個malloc?

+2

附註:'int x [y + 1]'是無效的C++(儘管大多數編譯器都支持它),它只在C中有效。 – vsoftco

回答

4

這是一個可變長度數組(VLA)。從技術上講,它在C++中不合法,但編譯器經常將其作爲擴展來支持它,但在打開時會生成警告。見 Why aren't variable-length arrays part of the C++ standard?

它是合法的C.

+0

要特別注意(C11標準,第6.7.6.2 - 4節)例如,請參閱最新的免費草案:[**編程語言 - C,國際標準(委員會第N1570號草案,2011年4月12日)**](http://www.open-std.org/ JTC1/SC22/WG14 /網絡/文檔/ n1570.pdf) –

0

int[]在堆棧上,而malloc'd或new'東西堆在一起。

非常基本int[]就會自動到達時,分配(其中,y是已知的),當它得到超出範圍被丟棄。這不是在啓動時已經分配的所有東西。

有沒有隱藏malloc來電或東西,那就是堆棧存儲器是如何工作的。

(我希望從別人的答案究竟是誰知道C/C++)

-1

int x[y+1]如你想它不可能發生。您只能有int x[SOME_CONSTANT_HERE]。如果y被聲明爲const,那麼這將工作。

這是因爲在C/C++中沒有魔法 - 文件範圍內的項目只會在編譯時分配,並且當它們進入時,本地項目將被彈出堆棧(如Felk提到的)超出範圍(即,執行進入並離開塊)。但後者不是以你想的方式動態分配的,通​​過malloc();它是(用戶)堆棧。 (注意:顯然有些C99編譯器會讓你聲明一個可變大小的數組,如果這個數組是一個局部變量,並因此在用戶堆棧上創建的,如果你嘗試這樣做肯定是錯誤的但是。)