gpt4 book ai didi

c - 不兼容的指针类型将 'char (*)[128]' 传递给类型 'char **' 的参数

转载 作者:行者123 更新时间:2023-11-30 18:33:30 25 4
gpt4 key购买 nike

我不明白为什么以下代码会生成此错误:

不兼容的指针类型将“char (*)[128]”传递给“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,

的原型(prototype)
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

我做错了什么?

最佳答案

getline 将为您分配一个缓冲区(当您使用完它时,您应该释放它)。无需向其传递指向静态分配缓冲区的指针,只需向其传递指向 char * 的指针即可。如果指针为 NULL,它将分配一个新的缓冲区并将您指向它。将 char line[128]; 更改为 char *line = NULL; 应该可以解决问题;只需记住在使用完毕后将其释放即可。

来自手册页:

If *lineptr is NULL, then getline() will allocate a buffer for storing the line, which should be freed by the user program. (In this case, the value in *n is ignored.)

Alternatively, before calling getline(), *lineptr can contain a pointer to a malloc(3)-allocated buffer *n bytes in size. If the buffer is not large enough to hold the line, getline() resizes it with realloc(3), updating *lineptr and *n as necessary.

In either case, on a successful call, *lineptr and *n will be updated to reflect the buffer address and allocated size respectively.

它在您的示例 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;
}

关于c - 不兼容的指针类型将 'char (*)[128]' 传递给类型 'char **' 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com