我用C语言编写了以下函数,但有两个问题:
我被要求释放动态分配的内存,以防止使用过多的RAM,但是行free(word)
只会导致程序出错。
如果我删除它,一切正常,为什么会这样呢?按照许多不同文章的建议使用完word
后,我免费使用了。
我被要求以最小的空间使用malloc,但是我该怎么做呢?
当前,我的代码分配了max_str_len
个RAM块,但是如果单词像a
这样的字母短得多,我不想为此分配200个块。
有什么建议吗?
int read_words(char *words[], int size, int max_str_len) {
char *word;
char ch;
int i;
for (i = 0; i < size; ++i) {
word = (char *)malloc((max_str_len + 1) * sizeof(char));
if (word == NULL)
return -1;
for (int j = 0; j < max_str_len; ++j) {
scanf("%c", &ch);
if (ch == '\n') break;
if (ch == EOF || ch == 'R') return i;
word[j] = ch;
}
words[i] = word;
free(word);
}
return i;
}
答案 0 :(得分:0)
您将malloc
和char*
放入了呼叫者提供的words[i]
中,然后释放了它。那没有道理。如果您将其释放,则呼叫者将无法对其进行任何操作。
如果您希望malloc
的字符串最小,则可以realloc
进行输入,或者您可以读入一个较大的缓冲区(可能在函数开始时分配),然后将结果复制到malloc
大小合适的缓冲区。
请注意,如果您在函数中间遇到内存故障,也将无法检查scanf
是否存在错误,并且正在泄漏内存-通过返回-1,您实际上丢失了有关如何words
的许多元素已被拥有的指针填充。您可能想返回该信息(return i;
或释放在malloc
失败之前该函数分配的所有指针。
答案 1 :(得分:0)
您的代码中存在多个问题:
scanf()
将返回EOF
,然后该字符将不会设置为EOF
,这可能不适用于{{1 }}。您应该使用char
并将getchar()
设为ch
。int
来缩小内存块。这是修改后的版本:
realloc