嗨,我读到我应该尽快调用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()
失败。