这是我目前正在撰写的函数的核心。
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <ctime>
#include <cstring>
const char *words[] = {
"pigu",
// "third",
// "country",
// "human",
// "define",
};
#define word_count (sizeof(words) / sizeof(char *))
const char *allowed_chars = "abcdefghijklmnopqrstuvwxyz";
const char *get_random_word()
{
return words[rand() % word_count];
}
char *copy(const char *origin)
{
char *str = NULL;
str = (char *)malloc(sizeof(origin));
strcpy(str, origin);
return str;
}
int run()
{
const char *selected_word = get_random_word();
char *active_word = copy(selected_word);
char *placeholder_word = copy(selected_word);
char *left_chars = copy(allowed_chars);
free(active_word);
free(placeholder_word);
free(left_chars);
return 1;
}
int main(int argc, char *argv[])
{
srand(time(NULL));
while (run())
{
}
printf("\n");
return 0;
}
我已经删除了其他代码,并设法将问题定位到run
函数,在这种情况下将无限运行,但是在调试时我已在run
函数内设置了断点。事实证明,在第二次运行函数run
之后,程序在尝试执行free(placeholder_word);
时崩溃。为什么会发生这种情况,我怎么能阻止它。
答案 0 :(得分:1)
您的copy
函数错误,sizeof(origin)
返回所需的字节数
将指针存储在内存中,而不是字符串的长度。所以你已经分配了
不正确的字节数以及字符串的长度是否大于
sizeof(origin) - 1
,然后你会溢出缓冲区,这会导致
未定义的行为可以解释段错误。
应该是
char *copy(const char *origin)
{
char *str = NULL;
str = malloc(strlen(origin) + 1);
if(str == NULL)
return NULL;
strcpy(str, origin);
return str;
}
请注意,我已删除{C}中不需要的malloc
的演员表。如果您
需要它,因为这是一个C ++程序,使用new
而不是malloc
。
在访问之前,您应该始终检查malloc
是否返回NULL
存储器中。