有没有一种方法可以在不调用malloc的情况下从堆中分配内存? 以下电话会对它产生影响吗?
void* loc = (void*) &heap[end_of_heap];
答案 0 :(得分:7)
没有。 C语言本身不提供此类功能。如果您只关心Unix系统符合旧版Unix标准(SUSv2或更早版本,如果我没记错的话)的弃用功能,brk
和sbrk
函数提供此功能。但你真的不应该使用它,除非你编写的代码永远不需要是可移植的。
答案 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以避免内存碎片。