getline() 内存重新分配失败

getline() memory reallocation fails

使用 FILE * some_file("somefile.txt", "r") 成功打开文件后,我正在使用 getline() 读取一行。 我可以提供 getline() 足够的缓冲区 char * line = malloc((size_t) 1024);,效果很好。我还可以提供比所需更少的缓冲区 - char * line = malloc((sizeof(char)))NULL-指针 char * line = NULL;,并且正如预期的那样,getline() 是 allocating/reallocating 并修改 line.

char * line = malloc((sizeof(char)))
size_t n;
n = getline(&line, &n, some_file);

但是如果我在没有定义一些值或缓冲区的情况下声明一个指针,我会得到错误 not enough space (系统没有崩溃!)。

char * line ;
size_t n;
n = getline(&line, &n, some_file); // Error: Not enough space

提供特定缓冲区 char * line = malloc(sizeof(char))) 和 [=23] 之间的区别在哪里 - 这应该是一个指向字符的指针(我知道我被允许使用这个内存,因为 malloc()) =] - 这也应该是一个指向 char 的指针(当然我不知道我是否允许使用这个内存,但是程序没有崩溃)?

问题是缺少变量的初始化,这导致了 getline 不期望的值。如果单元化,具有 自动存储持续时间的变量具有不确定的值 。使用这些值将导致未定义的行为

初始化 line 的正确方法是将其设置为 NULL 并让 getline 执行看起来合适的 malloc,

如果你已经分配了一些你坚持要在这里再次使用的内存,那么n需要设置为内存分配的大小。 IE。或者:

char * line = malloc(1);
size_t n = 1;
ssize_t rv = getline(&line, &n, some_file);

char * line = NULL
size_t n; // or can explicitly initialize this to `= 0` but it shouldn't matter
ssize_t rv = getline(&line, &n, some_file);

因此,您问题中的两个 摘录完全错误

最后,return 值是 ssize_t 类型,它 n 无关,只是在 return 的值 严格小于 存储在 n 中的值。你不能把它存储在同一个变量中!


要使用 getline 处理某些文件中的 每一 行,无需调用 malloc - 只需让 getline处理内存分配:

char * line = NULL;
size_t n = 0;
while (1) {
    errno = 0;
    ssize_t rv = getline(&line, &n, some_file);
    if (rv < 0) {
        if (feof(some_file)) {
            fprintf(stderr, "end of file, no problemo.");
        }
        else if (ferror(some_file)) {
            perror("an error occurred while reading from the file");
        }
        else {
            perror("some other error occurred");
        }
        free(line);
        break;
    }

    // at this point `line` points to an array
    // of `rv` characters, with possible embedded nulls,
    // meaning one line of data from the file,
    // + the terminating null character
    //
    // `n` is the *total number* of allocated bytes in the 
    // allocation pointed to by `line`.

    printf("I got a line of input: ");
    fwrite(line, 1, rv, stdout);
}