【发布时间】: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_strdup 和my_strcat 与strdup 和strcat 完全相同。
但是问题来了!游戏经常运行,但有时(尤其是当我选择 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 < size)吗? -
如果你是
my_strdup()ing,为什么需要malloc()? -
"请注意 my_strdup 和 my_strcat 与 strdup 和 strcat 完全相同。" -- 那你为什么不直接使用
strdup和strcat呢? -
my_strcat(tab[i], "|")将很难在tab[i]指向的缓冲区中找到一个终止符,这是cat的基础,因为在raw-malloc 之后没有建立任何终结符。随之而来的内存泄漏本身就是一种奖励。 -
由于您的代码中没有
free(),因此无法知道您是否使用了两次free()。
标签: c