如何在使用malloc旁边访问堆内存?

时间:2010-09-03 15:10:14

标签: c heap

有没有一种方法可以在不调用malloc的情况下从堆中分配内存? 以下电话会对它产生影响吗?

void* loc = (void*) &heap[end_of_heap];

5 个答案:

答案 0 :(得分:7)

没有。 C语言本身不提供此类功能。如果您只关心Unix系统符合旧版Unix标准(SUSv2或更早版本,如果我没记错的话)的弃用功能,brksbrk函数提供此功能。但你真的不应该使用它,除非你编写的代码永远不需要是可移植的。

答案 1 :(得分:6)

除了malloc和朋友之外没有可移植的方法,但如果你愿意在老式的Unix(不是当前的Posix)中获得特定于平台的sbrk(和brk),则使用成为潜在的系统调用。现在他们的手册页说了

  

避免使用brk()和sbrk():   malloc(3)内存分配包是   该          便携且舒适的分配内存的方式。

并且这个建议肯定是好的(即使在提供它们的平台上也没有使用老式系统调用的真正优势)。某些mmap的{​​{1}}对于某些现代Unix版本来说是完全不同的方式,Windows为此目的有自己完全不同的“win32 API调用”,依此类推。

答案 2 :(得分:3)

除了使用堆分配函数之外,无法获得指向新的有效堆内存的指针。您不能简单地将指针添加到现有指针末尾的堆中,并希望可靠地访问它。

答案 3 :(得分:2)

标准没有说堆的任何内容(搜索它,如果你不相信这个)。甚至不需要实现堆(如我们通常所知)。

但是,对于您的问题的简短回答是,标准C中没有。除非您使用特定于平台的API。通常,OS API有时会为访问内存提供一些余地。

答案 4 :(得分:2)

如果没有malloc,您无法可靠地访问堆,但是有内存分配的替代方法。

如果您想要更好地控制内存分配,可以使用其他内存管理器,如bget memory allocator。在这里,您使用malloc获取了大量的堆(预期的最大内存需求+一些开销)并使用bpool将其传递给bget。从那里开始,拨打bget而不是malloc来分配内存,brel来释放内存。 bget是reportedly better以避免内存碎片。