'./a.out'出错:free():无效*** .`allum1'错误:free():下一个大小无效(快):0x00000000023e13f0 ***

时间:2015-02-16 10:33:17

标签: c

我正在用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尺寸时),我会收到以下消息:

  

&#34; *** ./allum1中的错误:free():下一个大小无效(快):   0x00000000022953f0 *** allum1:malloc.c:2365:sysmalloc:断言   `(old_top ==(((mbinptr)(((char *)&amp;((av) - &gt; bins [((1) - 1)* 2])) -   __builtin_offsetof(struct malloc_chunk,fd))))&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)&gt; =(unsigned long)(((__ builtin_offsetof   (struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&amp;   〜((2 *(sizeof(size_t))) - 1)))&amp;&amp; ((old_top) - &gt; size&amp; 0x1)&amp;&amp;   ((unsigned long)old_end&amp; pagemask)== 0)&#39;失败。中止&#34;

所以我认为问题来自于我的mallocs和frees,我再次检查,它们似乎都合乎逻辑!

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

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

2 个答案:

答案 0 :(得分:3)

      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]有一些合理的内容之前没有任何意义。

答案 1 :(得分:0)

您在程序中进行了不必要的复杂化,在第(n-1)行的第n行构建依赖项,而您可以直接创建行。停止strdup,使用简单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
}