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