内存分配和getline

问题描述 投票:0回答:2

我不明白这段代码中为什么* line指针没有malloc,getline是否动态分配内存?如果指针不指向内存地址,则必须指向NULL吗?如果操作正确,我会看到getline(&line, &len, fp) != -1 getline的返回值是多少。

#include <stdio.h>

int main(int argc, char * argv[])
{
    FILE    *   fp;             // file pointer
    char    *   line = NULL;
    int         len  = 0;

int cnt = 0;    

if( argc < 3)
{
    printf("Insufficient Arguments!!!\n");
    printf("Please use \"program-name file-name N\" format.\n");
    return -1;
}

// open file
fp = fopen(argv[1],"r");

// checking for file is exist or not
if( fp == NULL )
{
    printf("\n%s file can not be opened !!!\n",argv[1]);
    return 1;   
}

// read lines from file one by one
while (getline(&line, &len, fp) != -1)
{
    cnt++;
    if ( cnt > atoi(argv[2]) )
        break;

    printf("%s",line); fflush(stdout);
}

// close file
fclose(fp);

return 0;
}
c file pointers getline
2个回答
0
投票

参考http://man7.org/linux/man-pages/man3/getline.3.html

ssize_t getline(char ** lineptr,size_t * n,FILE * stream);

如果* lineptr设置为NULL,并且* n在调用前设置为0,则getline()将分配一个缓冲区来存储行。这个缓冲区即使getline()失败,用户程序也应释放它。

或者,在调用getline()之前,* lineptr可以包含一个指向分配了malloc(3)的缓冲区的指针* n个字节。如果缓冲区的大小不足以容纳该行,getline()调整其大小使用realloc(3),根据需要更新* lineptr和* n。

[无论哪种情况,在成功呼叫后,* lineptr和* n都会更新分别反映缓冲区地址和分配的大小。

因此,如果您向其传递getline指针和NULL为0,则len将分配内存。循环内将来的调用不会分配新的内存,而是使用相同的地址。如果长度不足,则调用realloc

此外,作为最佳实践,您应该在最后释放line。即使getline返回了-1],也应调用此free


0
投票

请注意此声明

© www.soinside.com 2019 - 2024. All rights reserved.