malloc如何工作与堆栈有关?应该在哪里推送变量?

时间:2012-02-02 22:54:38

标签: c assembly stack malloc

我正在使用OS程序,我正在试图弄清楚malloc如何与堆栈相关。当用户调用malloc时,指针是从堆栈顶部的malloc返回的,是在给定空间之后还是在给定空间的底部?

如果我使用汇编代码将变量加载到这个新空间中,并且填充整个空间是不够的,那么应该在释放空间的开头推入变量,还是将其推到最后一个空间的位置变量会占用malloc给出的最后一个可用空间量吗?

感谢。

4 个答案:

答案 0 :(得分:3)

malloc的重点是从堆栈中分配,而是从heap分配。如果要从堆栈中分配,则使用alloca

如果你在堆栈上分配并保留当前的堆栈帧(也就是你从函数返回),那么先前堆栈分配的东西可能(在大多数情况下:将)稍后被不同的函数调用覆盖。所以这显然不是“长期”存储的地方。对于需要比函数调用更长寿的数据,需要从堆中进行分配。这就是malloc所做的。

malloc如何开展工作取决于可用的操作系统功能和实施。请参阅问题:How do malloc() and free() work?

答案 1 :(得分:2)

通常,malloc内存不是从堆栈中分配的,而是从堆中分配的。

答案 2 :(得分:0)

返回的指针包含HEAP上已分配内存的开头地址。 malloc内存不在堆栈中。如果内存被用作数组,那么你将从头开始 - 数组上的[]运算符只是起始指针的偏移量。

答案 3 :(得分:0)

通常我们有这种情况:

.data | .bss | heap ->   ||    <- stack     

我们有第一个非零初始化(.data部分)静态对象和零初始化(.bss部分)静态对象,然后是堆(由malloc分配的对象),然后是堆栈(自动对象)。堆栈向下增长,堆向上增长。 (堆栈通常向下增长,但在某些系统上它会向上增长。)

请注意,C不需要堆栈。