棧上分配變長數組

在初學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 

相關文章
相關標籤/搜索