调用malloc()

时间:2019-12-25 13:16:43

标签: c dynamic malloc free c99

我用C语言编写了以下函数,但有两个问题:

  1. 我被要求释放动态分配的内存,以防止使用过多的RAM,但是行free(word)只会导致程序出错。 如果我删除它,一切正常,为什么会这样呢?按照许多不同文章的建议使用完word后,我免费使用了。

  2. 我被要求以最小的空间使用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;
}

2 个答案:

答案 0 :(得分:0)

您将mallocchar*放入了呼叫者提供的words[i]中,然后释放了它。那没有道理。如果您将其释放,则呼叫者将无法对其进行任何操作。

如果您希望malloc的字符串最小,则可以realloc进行输入,或者您可以读入一个较大的缓冲区(可能在函数开始时分配),然后将结果复制到malloc大小合适的缓冲区。

请注意,如果您在函数中间遇到内存故障,也将无法检查scanf是否存在错误,并且正在泄漏内存-通过返回-1,您实际上丢失了有关如何words的许多元素已被拥有的指针填充。您可能想返回该信息(return i;或释放在malloc失败之前该函数分配的所有指针。

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您释放了分配给每个单词的内存,但是您将指针返回给调用方提供的数组中已释放的块,当调用方取消引用这些指针时会导致未定义的行为。
  • 您对文件结尾的测试不正确:scanf()将返回EOF,然后该字符将不会设置为EOF,这可能不适用于{{1 }}。您应该使用char并将getchar()设为ch
  • 您应该在读取的字符串的末尾设置一个空终止符。
  • 一旦知道字符串长度,就可以使用int来缩小内存块。

这是修改后的版本:

realloc