2017-10-18 41 views
0

主:malloc.c:2405:SYSMALLOC:断言`(old_top == initial_top(AV)& & old_size == 0)|| ((unsigned long)(old_size)> = MINSIZE & & prev_inuse(old_top)& &((unsigned long)old_end &(pagesize - 1))== 0)'failed。SYSMALLOC:断言

当试图产生一个双向链表,用户可以只添加到头部或尾部,我最终得到可爱的流产消息在顶部。

我已经使用gdb将其缩小到它造成这种情况的功能,但我真的不知道我在做什么错误。它分配第一个节点,然后,它会抛出错误。
的功能如下:

data* initD(){ 
    data *D = NULL; 

    D = malloc(sizeof(data*)); 
    if (!D){ 
     printf("Error in allocation of data\n"); 
     exit(0); 
    } 

    D->head = NULL; 
    D->tail = NULL; 
    D->next = NULL; 
    D->prev = NULL; 
    D->val = -1; 

    return D; 
} 
+2

'malloc(sizeof(data *))'?如果'sizeof(data)!= sizeof(data *)'(这看起来很可能考虑你以后的任务)呢? –

+0

为什么不是?它只是一个指向内存中某个地方的指针。数据是一个在头文件中定义的结构,所以我不明白它不可能是数据的大小* – Ohunter

+0

@Ohunter指针的大小是固定的。但是你的结构可能会比指针的大小更大。任何类型的指针的大小都是相同的。 –

回答

3

你写你的分配的缓冲区之外。

那是因为你的malloc调用传递错误大小:

D = malloc(sizeof(data*)); // allocate memory for a single pointer 

应该是:

D = malloc(sizeof(data)); // allocate memory for a whole struct 

不过说真的,

D = malloc(sizeof *D); // allocate memory for whatever D points to 

是最好的,因为你不需要查看D的声明以检查此行是否正确。

+0

不会sizeof(* D)与sizeof(D)相同吗? – Ohunter

+0

@Ohunter'* D'根本不是指针。 'D'是一个指针(指向'* D')。不,它们的大小不一样。在一个64位机器上,D是8个字节(指针的大小),而D *是40个字节(数据的大小:4个指针加1个val)。 – melpomene

1

您的data指针(data*)分配内存,但你需要内存来STOE data。您必须使用D = malloc(sizeof(data))