ошибка: несовместимый тип для аргумента 1 'pu sh' - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать связанный список, но не могу передать ошибки. Кто-нибудь может помочь мне понять, что происходит? Я уже изменяю тип структур, но ничего не меняется.

Я пытаюсь создать связанный список, но я не могу передать ошибки. Кто-нибудь может помочь мне понять, что происходит? Я уже меняю тип структур, но ничего не меняется.

/*gcc -o lista.exe lista.c -Wall -pedantic -Wextra*/
#include <stdio.h>
#include <stdlib.h>

struct list
{
  int info;
  struct list *next;
};

void push(struct list, int);

int main(int argc, char *argv[])
{
  struct list *list;

  argc = argc;
  argv = argv;

  /*Start list*/
  list = (struct list *)malloc(sizeof(struct list));
  list->info = 5;
  list->next = NULL;

  push(&list, 70);

  return 0;
}

void push(struct list **list, int info)
{
  struct list *new;
  new = (struct list *)malloc(sizeof(struct list));
  new->info = info;
  new->next = NULL;

  *list->next = new;
}
lista.c: In function 'main':
lista.c:25:3: error: incompatible type for argument 1 of 'push'
lista.c:11:6: note: expected 'struct list' but argument is of type 'struct list **'
lista.c: At top level:
lista.c:30:6: error: conflicting types for 'push'
lista.c:11:6: note: previous declaration of 'push' was here
lista.c: In function 'push':
lista.c:37:8: error: request for member 'next' in something not a structure or union

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Прототип / объявление вашей функции для push не соответствует определению вашей функции для push. Вверху измените

void push(struct list, int);

на

void push(struct list**, int);

В качестве альтернативы вы можете стереть прототип функции для push и переместить определение для него выше main. Компилятор читает файлы сверху вниз, и поэтому в main при вызове push(&list, 70); компилятор будет жаловаться, если ему не известно о функции, соответствующей этой сигнатуре. Поскольку ваш прототип неверен, он не видит функцию, соответствующую типу возврата void с аргументами struct list**, int, поэтому он генерирует ошибку, которую вы видите.

Кроме того, я предполагаю, что у вас есть

argc = argc;
argv = argv;

для подавления предупреждений от неиспользуемых переменных. Если вы не планируете использовать argc или argv, вы можете изменить свою подпись main на int main(void){ ... } и утилизировать ее полностью.

0 голосов
/ 04 февраля 2020

Компилятор видит объявление

void push(struct list, int);

, после чего он встречает этот вызов

push(&list, 70);

, где первый аргумент имеет тип struct list **. И выдает ошибку, что тип параметра функции struct list и тип выражения аргумента struct list ** несовместимы.

Объявление функции без определения не совпадает с объявлением функции с определением после функция главная.

Но в любом случае определение функции недопустимо.

Это утверждение внутри функции

*list->next = new;

неверно. Это эквивалентно

*( list->next ) = new;

, где указатель list, имеющий тип struct list **, указывает на указатель, а не на объект структуры. То есть указанный указатель не имеет элемента данных next. И компилятор сообщает об этом

lista. c: 37: 8: ошибка: запрос на член 'next' в чем-то, не являющемся структурой или объединением

Функция должна быть объявлена ​​следующим образом

int push( struct list **, int );

и определена как

int push( struct list **list, int info )
{
    struct list *new_node = malloc( sizeof( struct list ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->info = info;
        new_node->next = *list;
        *list = new_node;
    }

    return success;
}

И в основном нет необходимости выделять головной узел вне функции push.

Вы должны написать

int main( void )
{
    struct list *list = NULL;

    push( &list, 5 );
    push( &list, 70 );

    return 0;
}
...