栈和堆都能动态或静态分配内存空间吗?
一、结论
堆只能通过动态申请分配内存空间,而栈两者方式都可以!
堆就不多说了,只能通过malloc、new等方式动态申请分配内存空间。下面来聊聊栈的两者申请方式。
二、栈静态分配内存空间
静态分配:在编译阶段即可确定对象的空间大小。最典型的就是:在一个函数中创建了一个数组,这就是一种栈的静态分配。
三、栈动态分配内存空间
在Linux,提供了一个名为alloca
的函数,和malloc类似,不同在于alloca是在栈上申请内存空间,并且不需要手动释放,内存会在栈退出时自动释放
。但alloca不宜使用在必须广泛移植的程序中,有些机器不一定具有传统意义上的"栈/堆"。
函数原型:
void* alloca(size_t size)
size为待申请栈的大小,void*返回申请空间的地址。失败时(size 过大),可能会存在栈溢出问题(可能会指向堆区或者其它区域)