我不知道为什么以下代码会产生此错误:
incompatible pointer types passing 'char (*)[128]' to parameter of type 'char **'
int main(int argc, char *argv)
{
char line[128];
size_t n;
FILE *fp = fopen(argv[1], "r");
if (NULL == fp)
{
log_error("%d. %s", errno, strerror(errno));
exit(EXIT_FAILURE);
}
while(-1 != getline(&line, &n, fp))
{
// do something
}
return 0;
}
错误由以下行-1 != getline(&line, &n, fp)
生成。这是getline,
的原型
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
我在做什么错了?
答案 0 :(得分:3)
getline
将为您分配一个缓冲区(完成后应释放)。与其将指针传递给静态分配的缓冲区,不如将指针传递给char *
。如果指针为NULL,它将分配一个新的缓冲区并指向您。将char line[128];
更改为char *line = NULL;
应该可以解决问题。只是记得在完成后将其释放。
在手册页中:
如果* lineptr为NULL,则getline()将分配用于存储行的缓冲区,该缓冲区应由用户程序释放。 (在这种情况下,* n中的值将被忽略。)
或者,在调用getline()之前,* lineptr可以包含一个指向malloc(3)分配的缓冲区的指针* n个字节。如果缓冲区的大小不足以容纳该行,则getline()使用realloc(3)调整其大小,并进行更新 * lineptr和* n(如有必要)。
无论哪种情况,在成功调用后,都会更新* lineptr和* n以分别反映缓冲区地址和分配的大小。
在示例main
函数中的外观:
int main(int argc, char **argv)
{
char *line = NULL;
size_t n;
FILE *fp = fopen(argv[1], "r");
if (NULL == fp)
{
log_error("%d. %s", errno, strerror(errno));
exit(EXIT_FAILURE);
}
while(-1 != getline(&line, &n, fp))
{
// do something
}
free(line);
return 0;
}