2017-10-18 60 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))