我正在执行无效指针的 free(),但无法检测到错误

Im doing free() of invalid pointer, but can't detect the error

我收到释放无效指针的错误。

将size设为100(最大单词数),将max_str_len设为50(一个单词的最大字母数,不包含'\0'。函数设置为扫描一个句子并将每个单词存储在单词数组中。

int read_words(char* words[], int size, int max_str_len){
    int wordsCounter = 0;

    for (int i = 0; i <size; ++i) {
        words[i]=(char*)malloc(sizeof(char)*(max_str_len+1));
        if(words[i]==NULL){
            //in case of failure it frees every word.
            for (int j = 0; j <i ; ++j) {
                free(words[j]);
            }
            return MALLOCERROR;
        }

        for (int j = 0; j <max_str_len+1; ++j) {
            if(scanf("%c", &words[i][j])==EOF){
                wordsCounter++;
                words[i][j]='[=10=]';
                if(j<max_str_len)
                    free(&words[i][j+1]);
                return wordsCounter;
                }
            if (words[i][j]==' ') {
                words[i][j] = '[=10=]';
                if(j<max_str_len)
                    free(&words[i][j+1]);
                break;
            }
        }
        wordsCounter++;

    }
    return wordsCounter;
}

我知道这里发生了什么;你正在分配一个大缓冲区,读入它,如果你不需要所有 space 这个词,那么你想归还内存。有道理。

你不能告诉分配器:free 从位置开始,但我们可以用 realloc() 做几乎相同的事情,它接受一个指针并调整数组的大小,可能将它移动到一个新的位置。在缩短数组的情况下,它应该非常有效。

而不是

if (j < max_str_len)
    free(&words[i][j+1]); // INVALID

尝试

if (j < max_str_len)
    words[i] = realloc(words[i], j+1);   // +1 for the NUL byte

这应该能满足您的需求。