嗨,我读到我应该尽快调用free()释放内存,但是以这种方式调用free时,我的代码将无法正常工作。有什么问题?

我想在每次迭代中以及发生错误时调用free()

int read_words(char *words[], int size, int max_str_len) {
    int i, j;
    char *ExtendedWord = NULL;
    for (i = 0; i < size && size != -1; ++i) {
        char tmp[1], ch, *word = tmp;
        for (j = 0; j < max_str_len; ++j) {
            if (scanf("%c", &ch) == EOF || ch == 'R') {
                size = -1;
                break;
            }
            if (ch == ' ')
                break;
            word[j] = ch;
            ExtendedWord = malloc((i + 2) * sizeof(char));
            if (ExtendedWord == NULL)
                return -1;
            strcpy(ExtendedWord, word);
            word = ExtendedWord;
            free(ExtendedWord);
        }
        word[j] = '\0';
        words[i] = word;
    }
    return i;
}

最佳答案

        strcpy(ExtendedWord,word);


strcpy()期望将“ C”字符串的第一个字符的地址作为第二个参数,该字符串实际上是一个char数组,其中至少一个元素等于'\0'

指向word的内存不满足此类要求。

因此,将调用臭名昭著的未定义行为,这可能会破坏程序的内存管理,进而导致free()失败。

09-25 21:27