2012-09-21 148 views

回答

5

函數alloca從來不是任何C標準的一部分。它典型地是由供應商提供的作爲擴展,以實現類似的可變長度陣列(「VLA」收費)C99:

void foo(int n) 
{ 
    char arr99[n];   // C99-style VLA 

    char * p89 = alloca(n); /* C89 work-around using "alloca" */ 

    // Usage: 
    for (int i = 0; i != n; ++i) 
    { 
     arr99[i] = p89[i] = '0' + i; 
    } 

} // memory is freed automatically here 

在兩種情況下,存儲器被自動管理,並在結束時釋放功能。

alloca的使用是精神上的負擔,因爲它不太適合C對象模型。例如,即使您將內存分配到嵌套範圍內,它也會一直保持活動狀態,直到封閉的函數的結束,而不僅僅是塊。 VLA有更好的語義,可以用動態的sizeof來查詢,而alloca分配的內存沒有等價的機制。

0

當你想做一個動態分配的分配(例如使用一個在運行時間變化的大小)時很方便,但仍然可以肯定,一旦調用alloca()的代碼超出範圍,它就全部清除。與所有自動(「堆棧」)分配一樣,如果意外地將指針存儲的時間超過其有效時間,將會傷到腳。