2012-01-30 56 views
0

我已經編寫了一個代碼來將新成員添加到列表中。當我增加兩名成員時,它的工作正常。但是,只要我添加第三個並編譯並運行代碼給我一個錯誤。代碼和錯誤如下:./a.out是後鏈接列表插入導致sysmalloc斷言錯誤

#include<stdio.h> 
#include<stdlib.h> 

struct list_no { 
struct list_no *prev,*nest; 
struct linked_list *fnl; 
int seq_no; 
}; 
static int counter = 0; 

struct list_no *lists,*first; 

int add_list() 
{ 
    struct list_no *temp; 

    counter++; 
    if(lists == '\0') 
    { 
     lists = (struct list_no *)malloc(sizeof(struct list_no)); 
     lists->prev = '\0'; 
     lists->nest = '\0'; 
     lists->fnl = '\0'; 
     lists->seq_no = 1; 
     first = lists; 
    } 
    else 
    { 
     temp = lists; 
     lists->nest = (struct list_no *)malloc(sizeof(struct linked_list)); 
     lists = lists->nest; 
     lists->fnl = '\0'; 
     lists->prev = temp; 
     lists->nest = NULL; 
     lists->seq_no = counter; 
    } 
    return 0; 
} 

int main() 
{ 
    int i=0,lcount; 
    int i=0,lcount; 

    char ch = 'y'; 
    first = '\0'; 
    lists = first; 
    int w; 

    while(i != 3) 
    { 
     add_list(); 
     printf("\n the val ::%d\n",lists->seq_no); 
     i++; 
    } 

    return 0; 
} 

錯誤消息來了:

the val ::1 
the val ::2 

a.out: malloc.c:3097: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted 

爲什麼它不能添加第三個成員?

+0

這是一個調試器的用途。 – 2012-01-30 08:47:56

+0

怎麼樣一個適當的主題?! – ezdazuzena 2012-01-30 08:50:05

+0

@OliCharlesworth嗨它的代碼看起來很好....你能給我什麼建議什麼可能是錯的 – karan421 2012-01-30 08:50:36

回答

0

你覆蓋你的指針

temp = lists; 
    lists->nest = (struct list_no *)malloc(sizeof(struct linked_list)); 
    lists = lists->nest; 

所以temp指向相同的內存lists。然後你爲lists->neste分配內存。之後,你讓lists指向那個內存,也就是說,temp指向它。

嘗試

memcpy((void*)temp, (*void) lists, sizeof(lists)); 
+0

這似乎不是一個正確的回答,但它被接受?! – ugoren 2012-01-30 20:59:35

0

兩個問題比較突出:

1)以下:

lists->nest = (struct list_no *)malloc(sizeof(struct linked_list)); 

應該使用sizeof(struct list_no)而不是sizeof(struct linked_list)。這可能是導致眼前問題的原因。

2)假設您的列表包含兩個元素。現在考慮下面一行:

lists->nest = (struct list_no *)malloc(sizeof(struct linked_list)); 

無論價值lists->nest之前上面得到執行,那麼現在付諸東流。你已經泄漏了內存並丟失了部分清單。

+0

賓果....感謝你 – karan421 2012-01-30 08:55:18

1

你的第二個malloc使用sizeof(struct linked_list),應該是sizeof(struct linked_no)
我猜這個結構比list_no小,.so當寫你腐敗的內存。
在第三次分配時,malloc看到了腐敗並感到不安。

的其他一些觀點:

  1. 「下一步」 應爲 「X」,而不是 「鳥巢」 拼寫。
  2. 指針應該初始化爲NULL而不是'\0'(結尾相同,但是NULL是正確的類型)。
  3. 您應該嘗試刪除條目分配和初始化的重複(第一次和以後的時間)。你的主要錯誤部分是由於這種重複。
+0

賓果....謝謝 – karan421 2012-01-30 08:54:54

0

因爲你做的第二種情況:

(struct list_no *)malloc(sizeof(struct linked_list)); 

這可能不分配足夠的存儲空間,因爲它只是一個linked_list結構分配足夠的內存,而不是list_no。你想做的事:

(struct list_no *)malloc(sizeof(struct list_no)); 

另外:鑄造malloc返回結果是不必要的,只是添加了混亂和替代'\0'因爲它使代碼更容易一點看,你應該使用NULL