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_listNULL,所以if语句为真,进入该块;但随后它因上述错误而失败。

我无法理解相同的行,相同的 calloc 如何在相同的函数中失败,具体取决于它是在 if 块内部还是外部。我在这里遗漏了一些东西,我在互联网上找不到任何解释。

解决方法

calloc/malloc 是如何工作的?

这在很大程度上取决于您的实施。

calloc/malloc 的一些实现是开源的:尝试在您的笔记本电脑上安装 Debian,研究 GNU libcmusl-libc 的源代码,并阅读 Linux From Scratch .然后 malloc有时使用系统调用,如 mmap(2)sbrk(2)。大多数情况下,malloc 会重用之前 freed 个内存区域。

另请参阅 this answer 以了解 malloc 的一个笑话实现,我认为它符合某些 C 标准(例如 n1570 或更好)。

另一方面,在 Windows 中阅读 malloc 的源代码是留给极少数快乐的人的。

在像 Arduino 这样的微控制器上,malloc 的工作方式非常不同。