基本上C程式的元素儲存在記憶體的時候有3種分配策略:
靜態分配
如果一個變數宣告為全域性變數或者是函式的靜態變數,這個變數的儲存將使用靜態分配方式。靜態分配的記憶體一般會被編譯器放在資料段或程式碼段來儲存,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平臺及gcc編譯器為例,全域性及靜態變數放在資料段的低端;全域性及靜態常量放在程式碼段的高階
自動分配
函式的自動區域性變數應該隨著函式的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,執行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數執行時改變大小。
所以說C函式永遠不應該返回一個區域性變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函式來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在執行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函式是malloc、calloc、realloc和free。
使用堆(Heap)記憶體將帶來額外的開銷和風險。
基本上C程式的元素儲存在記憶體的時候有3種分配策略:
靜態分配
如果一個變數宣告為全域性變數或者是函式的靜態變數,這個變數的儲存將使用靜態分配方式。靜態分配的記憶體一般會被編譯器放在資料段或程式碼段來儲存,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平臺及gcc編譯器為例,全域性及靜態變數放在資料段的低端;全域性及靜態常量放在程式碼段的高階
自動分配
函式的自動區域性變數應該隨著函式的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,執行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數執行時改變大小。
所以說C函式永遠不應該返回一個區域性變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函式來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在執行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函式是malloc、calloc、realloc和free。
使用堆(Heap)記憶體將帶來額外的開銷和風險。