2013-07-09 39 views
0

朋友你好我使用malloc的錯誤代碼是3096有一個問題:ç的malloc錯誤代碼:3096個

malloc.c:3096:SYSMALLOC:斷言`(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 * (爲size_t))) - 1)))& &((old_top) - >大小爲0x1 &)& &((無符號長整數)OLD_END & pagemask)== 0)」失敗。 中止

代碼:

char *malloc_tab(char *str) 
    { 
     if ((str = malloc(1024)) == NULL) 
     return (NULL); 
     return (str); 
    } 

    int  *malloc_tab_int(int *str) 
    { 
     int i; 

     i = 0; 
     if ((str = malloc(1024)) == NULL) 
     return (NULL); 
     while (i != 1024) 
     { 
      str[i] = 0; 
      i = i + 1; 
     } 
     return (str); 
    } 

char **malloc_dim_tab(char **str) 
{ 
    int y; 

    y = 0; 
    if ((str = malloc(1024 * sizeof(*str))) == NULL) 
    return (NULL); 
    while (y < 200) 
    { 
     if ((str[y] = malloc(1024 * sizeof(**str))) == NULL) 
     return (NULL); 
     y = y + 1; 
    } 
    return (str); 
} 

任何幫助,請!

+0

3096是不是錯誤代碼,它是失敗的斷言的源代碼行數當你看到foobar.c:1234的形式時,通常意味着foobar.c的1234行。 – Sneftel

回答

5

這是malloc_tab_int()功能中的一個錯誤:

if ((str = malloc(1024)) == NULL) 

,因爲它是分配1024個字節只,沒有足夠的存儲器,用於1024 int秒(sizeof(int)通常是4)。後續while正在初始化str陣列元素的循環將訪問超出分配的內存,導致undefined behaviour

要糾正,或者:

  • malloc()正確數目的字節:

    if ((str = malloc(1024 * sizeof(int))) == NULL) 
    /* if ((str = malloc(1024 * sizeof(*str))) == NULL) */ 
    
  • ,或者使用calloc()來初始化所述存儲器和消除while循環:

    str = calloc(1024, sizeof(int)); 
    /* str = calloc(1024, sizeof(*str)); */ 
    

其他:

  • str很爲int個列表中的混亂變量名。
  • malloc_tab()malloc_tab_int()中的論點不起任何作用。在這兩種情況下,這些功能可以進行修改,以單行return(然後爲什麼有這些在所有):

    char* malloc_tab()  { return malloc(1024);    } 
    int* malloc_tab_int() { return calloc(1024, sizeof(int)); } 
    
  • 的問題的另一種源將被試圖free()char*malloc_dim_tab()分配的陣列。只有前200個元素被初始化(指向malloc()d內存),但在分配的內存中有1024 char*。調用free()的值不是由malloc()realloc()calloc()返回的值,而是未定義的行爲(在此情況下可能發生,因爲824個元素將包含隨機值),但在NULL指針上調用free()是安全的。

0

你的錯誤代碼是這樣的: 「malloc.c:3096:SYSMALLOC:斷言`(old_top ==(((mbinptr)」 表示,由於當前的malloc()讀/寫未來的malloc之前溢出()在你的代碼

,你可以嘗試做: 海峽=的malloc(1024 *的sizeof(字符*))