【问题标题】:Error in './a.out': free(): invalid*** Error in `./allum1': free(): invalid next size (fast): 0x00000000023e13f0 ***'./a.out' 中的错误:free():无效*** `./allum1' 中的错误:free():下一个大小无效(快速):0x00000000023e13f0 ***
【发布时间】:2015-04-16 20:16:08
【问题描述】:

我正在用 C 开发一个小游戏: 显示这样的板:

   |

  |||

 |||||

|||||||

你必须拿起棍子,让 AI 选择最后一根棍子,让 AI 输掉比赛。为了让玩家能够选择棋盘的大小,我编写了以下函数:

char    **disp_board(int size)
{
    char  **tab;
    int   i;


    /* 
     * I malloc the board with the variable 'size' given by the user before the
     * game starts
    */

  if ((tab = malloc(sizeof(char *) * (size + 1))) == NULL)
    return (NULL);
  tab[size] = NULL;
  i = 0;
  while (i <= size)
  {
      if (i == 0)
      {
          if ((tab[i] = malloc(sizeof(char) + 1)) == NULL)
            return (NULL);
          tab[i] = my_strdup(my_strcat(tab[i], "|"));
          i++;                                           
      }
      if ((tab[i] = malloc(my_strlen(tab[i - 1]) + 3)) == NULL)
        return (NULL);
      tab[i] = my_strdup(my_strcat(tab[i - 1], "||"));
      i++;
  }
  disp_board2(tab, size);
  return (tab);
}

请注意my_strdupmy_strcatstrdupstrcat 完全相同。

但是问题来了!游戏经常运行,但有时(尤其是当我选择 10 号和 14 号时)我会收到以下消息:

"*** ./allum1 中的错误:free():下一个大小无效(快速): 0x00000000022953f0 ***allum1:malloc.c:2365: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 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' 失败。中止”

所以我认为问题出在我的 malloc 和 frees 上,我再次检查,它们看起来都很合乎逻辑!

提前感谢您的帮助,我真的希望我能解决这个问题。

如果您对代码有任何疑问,请告诉我。

【问题讨论】:

  • 不应该是while (i &lt; size)吗?
  • 如果你是my_strdup()ing,为什么需要malloc()
  • "请注意 my_strdup 和 my_strcat 与 strdup 和 strcat 完全相同。" -- 那你为什么不直接使用strdupstrcat呢?
  • my_strcat(tab[i], "|") 将很难在tab[i] 指向的缓冲区中找到一个终止符,这是cat 的基础,因为在raw-malloc 之后没有建立任何终结符。随之而来的内存泄漏本身就是一种奖励。
  • 由于您的代码中没有free(),因此无法知道您是否使用了两次free()

标签: c


【解决方案1】:
      if ((tab[i] = malloc(sizeof(char) + 1)) == NULL)
        return (NULL);
      tab[i] = my_strdup(my_strcat(tab[i], "|"));

当您从malloc 取回一个指针时,它并没有指向任何特定的内容,当然也不是您可以连接某些内容的有效字符串。将tab[i] 传递给my_strcat(假设它是一个连接函数)是没有意义的,直到tab[i] 有一些理智的内容。

【讨论】:

    【解决方案2】:

    您在程序中制造了不必要的复杂性,在 (n-1)-st 行的第 n 行中建立了依赖关系,而您可以直接创建一行。停止strduping,使用简单的malloc+memset 创建并填充行:

    for(i = 0; i < size; i++)
    {
        if ((tab[i] = malloc(2*i + 2)) == NULL) // create a string
          return (NULL);
        memset(tab[i], '|', 2*i + 1);           // fill it
        tab[i][2*i + 1] = 0;                    // add a terminator
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2012-10-25
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多