如何解决calloc 问题 - malloc.c:2385 错误 - calloc/malloc 如何工作?
运行我的程序时收到以下错误:
malloc.c:2385: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' 失败。
完整的代码是巨大的,但我设法在复制中找到了一些有趣的东西,我不明白为什么会发生这种情况。任何帮助和/或解释将不胜感激。
这是没有失败时的代码片段:
static void adjacent_list_get(struct elem **elem_list,struct elem *element,uint32_t *size) {
struct elem **t_elem_list;
t_elem_list = calloc((size_t) 1,sizeof(*t_elem_list));
if (!elem_list) {
...
这是失败时的代码片段:
static void adjacent_list_get(struct elem **elem_list,uint32_t *size) {
struct elem **t_elem_list;
if (!elem_list) {
t_elem_list = calloc((size_t) 1,sizeof(*t_elem_list));
...
在执行过程中,elem_list
为NULL
,所以if
语句为真,进入该块;但随后它因上述错误而失败。
我无法理解相同的行,相同的 calloc
如何在相同的函数中失败,具体取决于它是在 if
块内部还是外部。我在这里遗漏了一些东西,我在互联网上找不到任何解释。
解决方法
calloc/malloc 是如何工作的?
这在很大程度上取决于您的实施。
calloc/malloc
的一些实现是开源的:尝试在您的笔记本电脑上安装 Debian,研究 GNU libc 或 musl-libc 的源代码,并阅读 Linux From Scratch .然后 malloc
会有时使用系统调用,如 mmap(2) 或 sbrk(2)。大多数情况下,malloc
会重用之前 free
d 个内存区域。
另请参阅 this answer 以了解 malloc
的一个笑话实现,我认为它符合某些 C 标准(例如 n1570 或更好)。
另一方面,在 Windows 中阅读 malloc
的源代码是留给极少数快乐的人的。
在像 Arduino 这样的微控制器上,malloc
的工作方式非常不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。