C: 为什么我会在 free() 上出错

C: Why will I get an error on free()

我编写了以下函数,它将在标有 // Breakpoint 的行中中断:

char *parseNextWord(char *str)
{
    static char *lastStr = "";
    static int lastPosition = 0;

    if (strcmp(lastStr, str) != 0)
    {
        lastStr = str;
        lastPosition = 0;
    }

    if (lastPosition > 0 && str[lastPosition - 1] == 0)
    {
        return 0;
    }

    char *word = "";
    int wLength = 0;
    while (str[lastPosition] != ' ' && str[lastPosition] != '\n' && str[lastPosition] != '[=10=]')
    {
        char *tmp = (char*)malloc(++wLength * sizeof(char));
        for (int i = 0; i < sizeof(word); i++)
        {
            tmp[i] = word[i];
        }

        tmp[sizeof(*tmp) - 1] = str[lastPosition];
        free(word); // Breakpoint
        word = (char*)malloc(sizeof(*tmp));
        for (int i = 0; i < sizeof(tmp); i++)
        {
            word[i] = tmp[i];
        }

        free(tmp); // Breakpoint
        lastPosition++;
    }

    while (str[lastPosition - 1] != '[=10=]' && (str[lastPosition] == ' ' || str[lastPosition] == '\n' || str[lastPosition] == '[=10=]'))
    {
        lastPosition++;
    }

    return word;
}

函数可以这样调用:

char* string = "Name1 Name2\nName3 Name4\nName1";

int totalCount = 0;

char *nextWord = parseNextWord(string);
while (nextWord != 0)
{
    for (int c = 1; c < argc; c++)
    {
        if (strcmp((const char*)argv[c], nextWord) == 0)
        {
            totalCount++;
        }
    }

    nextWord = parseNextWord(string);
}

为什么我的代码免费破解?我该如何改进它?

我看到的相关代码是:

char* word = "";
free(word);

您没有分配空字符串 (""),因此您无法释放它。

你只能freemalloc

如果您没有分配它,请不要尝试释放它。


P.S. 这是我最好的分配内存的函数列表:

malloc
realloc 
calloc
strdup
asprintf 
vasprintf
(notably: _not_ alloca)         

也许还有其他人?

因为你第一次进入循环时没有分配word。 你只要让它指向不是动态分配的“”。

我的建议是在 while 之前添加初始值为 0 的整数变量:

if (flag != 0) {
free(word);
} else {
word = 1;
}