C函数再次运行时抛出异常

时间:2018-02-10 01:24:02

标签: c

这是我目前正在撰写的函数的核心。

#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);时崩溃。为什么会发生这种情况,我怎么能阻止它。

1 个答案:

答案 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 存储器中。