我不明白这段代码中为什么* 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;
}
参考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
请注意此声明