我正在使用OS程序,我正在试图弄清楚malloc如何与堆栈相关。当用户调用malloc时,指针是从堆栈顶部的malloc返回的,是在给定空间之后还是在给定空间的底部?
如果我使用汇编代码将变量加载到这个新空间中,并且填充整个空间是不够的,那么应该在释放空间的开头推入变量,还是将其推到最后一个空间的位置变量会占用malloc给出的最后一个可用空间量吗?
感谢。
答案 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不需要堆栈。