不兼容的指针类型,将“ char(*)[128]”传递给类型为“ char **”的参数

时间:2019-07-10 19:03:55

标签: c

我不知道为什么以下代码会产生此错误:

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);

我在做什么错了?

1 个答案:

答案 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;
}