2013-07-09 37 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(字符*))