我正在用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_strdup
和my_strcat
与strdup
和strcat
完全相同。
但这是问题所在!游戏很常见,但有时(特别是当我选择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,我再次检查,它们似乎都合乎逻辑!
提前感谢您的帮助,我真的希望我能解决这个问题。
如果您对代码有任何疑问,请告诉我。
答案 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
}