0

您好朋友我在使用 malloc 时遇到问题,错误代码是 3096:

malloc.c:3096: sSYSMALLOc: 断言`(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)' 失败。中止

代码:

    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);
}

任何帮助请!

4

2 回答 2

4

这是malloc_tab_int()函数中的一个错误:

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

因为它仅分配 1024 字节,所以没有足够的内存用于 1024int秒(sizeof(int)通常为 4)。while初始化数组元素的后续循环str将访问超出分配的内存,导致未定义的行为

要更正,请执行以下任一操作:

  • 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对于 s 列表来说,这是一个相当令人困惑的变量名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 内存),但char*分配的内存中有 1024 个。调用, orfree()返回的值以外的值是未定义的行为(在这种情况下可能会发生,因为 824 个元素将包含随机值),但调用指针是安全的。malloc()realloc()calloc()free()NULL

于 2013-07-09T09:02:04.950 回答
0

您的错误代码如下:"malloc.c:3096: sSYSMALLOc: Assertion `(old_top == (((mbinptr)" 表示由于当前 malloc() 在您的代码中的下一个 malloc() 之前写入/读取溢出)。

您可以尝试这样做: str = malloc(1024 * sizeof(char *))

于 2013-07-09T09:19:19.147 回答