несовместимые типы указателей, передающие 'char (*) [128] "параметру типа" char ** " - PullRequest
0 голосов
/ 10 июля 2019

Я не могу понять, почему следующий код генерирует эту ошибку:

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 Ответ

3 голосов
/ 10 июля 2019

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...