C - 如何从标准输入或文件内存保存读取字符串行

标签 c string malloc free readline

我需要一个节省内存的读取行版本。我有这个“有效”的解决方案。但我不确定它与内存的关系如何。当我启用 free(text) 时,它会运行几行,然后出现错误。因此,尽管我分配了文本,但现在文本和结果都没有被释放。那是对的吗 ?为什么会这样?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readFromIn()
{
    char* text = malloc(1024);
    char* result = fgets(text, 1024, stdin);
    if (result[strlen(result) - 1] == 10)
        result[strlen(result) - 1] = 0;
    //free(text);
    return result;
}

我有很多短行可以用它来读取,我还需要用FILE*句柄替换stdin。我不需要重新分配文本,因为我只有短行。

最佳答案

fgets 返回指向字符串的指针,因此在 fgets 行之后,result 将与 text 具有相同的内存地址。然后,当您调用 free (text); 时,您将返回无效内存。

完成结果后,您应该释放调用函数中的内存

您还可以通过构造代码来传递缓冲区来避免 malloc/free 的东西,如下所示:

void parent_function ()
{
    char *buffer[1024];

    while (readFromIn(buffer)) {
        // Process the contents of buffer
    }
}

char *readFromIn(char *buffer)
{
    char *result = fgets(buffer, 1024, stdin);
    int len;

    // fgets returns NULL on error of end of input,
    // in which case buffer contents will be undefined
    if (result == NULL) {
        return NULL;
    }

    len = strlen (buffer);
    if (len == 0) {
        return NULL;
    }

    if (buffer[len - 1] == '\n') {
        buffer[len - 1] = 0;

    return buffer;
}

如果您正在处理许多小而短暂的项目,那么尝试避免 malloc/free 可能是明智的,这样内存就不会碎片化,并且速度也应该更快。

关于C - 如何从标准输入或文件内存保存读取字符串行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14851925/

相关文章:

r - 查找一个字符串是否出现在另一个字符串之前

c - 指向函数中字符串的指针

c - 对结构的写入无效

c - 如果您在程序终止之前没有在 malloc 之后释放,那么真正会发生什么?

c++ - 我只是幸运 malloc 返回了一个零填充的缓冲区吗?

c - ALSA:打开和关闭 PCM On-The-Fly

c - 如何用另一个二维数组的内容填充一个二维数组的内容(其维度由用户输入)?

java - 使用旧版 JAVA API 进行 regExp 匹配

c - fork 后陷入 while 循环

c - 尝试使用指针在冒泡排序上编写程序时出现编译错误