C:为什么我会在free()上收到错误

时间:2015-01-22 23:00:54

标签: c 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] != '\0')
    {
        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] != '\0' && (str[lastPosition] == ' ' || str[lastPosition] == '\n' || str[lastPosition] == '\0'))
    {
        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);
}

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

2 个答案:

答案 0 :(得分:3)

我看到的相关代码是:

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

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

您只能free malloc

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

<小时/> P.S。这是我分配可以释放的内存的最佳功能列表:

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

也许还有其他人?

答案 1 :(得分:0)

因为您在第一次进入循环时没有分配单词。 你只是指出&#34;&#34;这是动态分配的。

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

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