栈上分配变长数组

今日看见CSDN博客主页上的一篇推荐博文,结果因为博文的错误理解遭来技术宅们的口诛笔伐。博主文中的一句“建立在栈上的数组大小肯定是在编译时候就确定的”为其带来了飞来横祸。http://blog.csdn.net/woshishenguanyear/archive/2011/06/13/6542527.aspx 

 

在初学C语言时,我们为了方便记忆,往往认定静态分配数组在栈上,动态分配数组在堆上,这确实为实现21天学会C语言的宏伟目标提供了便利。但是实际上C99标准已经允许程序在栈上分配变长数组。

/* s1 and s2 are two strings(char*) */

char str[strlen (s1) + strlen (s2) + 1]; /* 栈上的变长数组 */

strcpy (str, s1);

strcat (str, s2);

 

不仅如此,C语言中很早就有alloca函数完成这一工作,后来有了标准的支持,alloca的使用也就名正言顺了。alloca用于在调用者的栈上分配空间,分配的临时空间会在调用alloca的函数返回时被自动释放(也就是同所在的栈帧共生死)。

其函数原型是

    void *alloca(size_t size);

 

GCCalloca以一个内建函数的方式存在 # define alloca(size) __builtin_alloca (size) 

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 


posted @ 2011-06-22 08:32  Knowledge Base  阅读(1039)  评论(0编辑  收藏  举报