在初學C語言時,咱們爲了方便記憶,每每認定靜態分配數組在棧上,動態分配數組在堆上,這確實爲實現21天學會C語言的宏偉目標提供了便利。可是實際上C99標準已經容許程序在棧上分配變長數組。html
/* s1 and s2 are two strings(char*) */linux
char str[strlen (s1) + strlen (s2) + 1]; /* 棧上的變長數組 */數組
strcpy (str, s1);函數
strcat (str, s2);ui
不只如此,C語言中很早就有alloca函數完成這一工做,後來有了標準的支持,alloca的使用也就名正言順了。alloca用於在調用者的棧上分配空間,分配的臨時空間會在調用alloca的函數返回時被自動釋放(也就是同所在的棧幀共生死)。.net
其函數原型是htm
void *alloca(size_t size);內存
GCC中alloca以一個內建函數的方式存在 # define alloca(size) __builtin_alloca (size) get
alloca的優勢有:原型
alloca也有不少缺點和限制,一旦分配棧空間形成棧溢出,結果將是不可預知的。並且這個函數是與平臺編譯器相關的,不適宜在跨平臺程序中使用。因此除非特別須要,通常不提倡使用。
在VS中也提供了功能相同的_alloca()
參考文獻:
http://linux.die.net/man/3/alloca
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.html