我正在执行无效指针的 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
这应该能满足您的需求。
我收到释放无效指针的错误。
将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
这应该能满足您的需求。