c - 堆栈变量与堆变量

标签 c

我的想法是否正确:

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/

相关文章:

c - 读写 C 系统调用是否使用缓冲区?

c++ - 指针如何引用硬盘中的一个段

字符指针和 printf 函数

c++ - 将文本转换为 C/C++ 字符串的库

c - 在 C 中的 fork 进程内的 scanf 之前调用 Printf

c - 如何在解析表达式语法(如 PEG.js)中处理语法上的歧义(如在 C 中)

c - ARM 过程调用标准是否允许与 C 标准相矛盾的 volatile 优化?

c++ - 具有两个假值的二进制 AND 结果为真

c - 为什么带有指针的c程序不起作用?

c - 确定 PRIME 数