我的想法是否正确:
char *buff[500];
... 创建一个堆栈变量,并且:
char *buff = (char *)malloc(500);
...创建一个堆变量?
如果那是正确的,那么什么时候以及为什么要使用堆变量而不是堆栈变量,反之亦然。我知道堆栈速度更快还有什么。
最后一个问题,main函数是栈上的栈帧吗?
最佳答案
是的,第一个在堆栈中创建了一个 char 指针数组,大约 500*4 字节
,第二个在堆中分配了 500 个字符并将堆栈 char ptr 指向它们。
在栈中分配简单且快速,但栈是有限的,堆较慢但更大。除此之外,一旦离开范围,堆栈分配的值就会被“删除”,因此它非常适合像原始变量这样的小局部值。
如果你在堆栈中分配太多,你可能会用完堆栈而死,main
因为你执行的所有函数在堆栈中都有一个堆栈帧,函数的所有局部变量都是存储在那里,所以深入研究函数调用可能也会让您陷入 stackoverflow。
通常,在堆中分配您经常使用且大于 100 字节的任何内容以及在堆栈中分配小变量和指针是一个很好的经验法则。
关于c - 堆栈变量与堆变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5258724/