c语言数组在栈上的分配,栈上分配变长数组 - 金桔柠檬茶的个人空间 - OSCHINA - 中文开源技术交流社区...

本文揭示了C99标准后栈上可以分配变长数组的特性,并介绍了alloca函数的用法、优缺点及限制。学习者需注意其与平台相关性和栈溢出风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

alloca的优点有:

不浪费空间,访问快速

不会造成内存碎片

不用担心发生内存泄漏

alloca也有很多缺点和限制,一旦分配栈空间造成栈溢出,结果将是不可预知的。而且这个函数是与平台编译器相关的,不适宜在跨平台程序中使用。所以除非特别需要,一般不提倡使用。

在VS中也提供了功能相同的_alloca()

参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值