C 错误:“推送”的参数1的类型不兼容

C 错误:“推送”的参数1的类型不兼容,c,struct,compiler-errors,linked-list,singly-linked-list,C,Struct,Compiler Errors,Linked List,Singly Linked List,我正试图建立一个链表,但我无法传递错误。有人能帮我弄明白发生了什么事吗?我已经改变了结构的类型,但没有任何改变 /*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

我正试图建立一个链表,但我无法传递错误。有人能帮我弄明白发生了什么事吗?我已经改变了结构的类型,但没有任何改变

/*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;
}
我正试图建立一个链表,但我无法传递错误。有人能帮我弄明白发生了什么事吗?我已经改变了结构的类型,但没有任何改变

/*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;
}

推送的函数原型/声明与推送的函数定义不匹配。在顶端,改变

void push(struct list, int);

或者,您可以删除push的函数原型,并将其定义移到main之上。当调用push&list,70;时,编译器从上到下读取文件,在main中也是如此;,如果编译器不知道与该签名匹配的函数,它会抱怨。因为原型是错误的,所以它没有看到与返回类型void和参数struct list**,int匹配的函数,所以它生成了您看到的错误

顺便说一句,我想你有

argc = argc;
argv = argv;

抑制来自未使用变量的警告。如果您不打算使用argc或argv,您可以将主签名更改为int mainvoid{…},并将其完全丢弃。

编译器会看到声明

void push(struct list, int);
之后它会遇到这个调用

push(&list, 70);
其中第一个参数的类型为struct list**。并发出一个错误,即函数参数struct list的类型与参数表达式struct list**的类型不兼容

没有定义的函数声明与函数main后面有定义的函数声明不一致

但在任何情况下,函数定义都是无效的

函数中的此语句

*list->next = new;
这是不正确的。相当于

*( list->next ) = new;
其中,具有struct list**类型的指针列表指向一个指针,而不是指向一个结构对象。也就是说,指向的指针没有下一个数据成员。编译器报告了这一点

lista.c:37:8:错误:在非 结构或结合

函数的声明方式如下

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;
}
而且基本上不需要在功能推送之外分配头节点

你应该写

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

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

    return 0;
}

@eanpdt什么是魔法语句argc=argc;argv=argv;do?@eanpdt只需将main的参数替换为void.OT:about:list=struct list*mallocsizeofstruct list;1在C中,返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱。建议去掉那个石膏。2打电话给malloc时,务必检查=NULL返回值以确保操作成功。如果不成功,调用perror或malloc失败;其次是:退出失败;关于:结构列表*列表;使用类型名作为变量名是一种糟糕的编程实践。建议:结构列表*myList;关于:void pushstruct list**list,int info为什么**?代码不会改变list变量指向的位置。这个答案非常好,直到:*list=new\u node;这将改变头部节点在主要点的位置。但是,该头节点已经指向内存分配,因此该语句会导致内存泄漏,不会导致链接列表中出现两个条目这是什么:int success new_node!=无效的预计会怎样?也许你的意思是:如果!单面单链表上的新_节点{//handle error}@user3629249将新节点附加到列表的开头。没有内存泄漏。请参见我展示的main的实现。所以你的评论没有意义。@user3629249函数实现非常简单明了。我不知道你在问这样一个问题。此语句指定是否成功分配内存的标志。什么是不清楚的?!但是,这可能是OP想要在列表的开头插入新节点;这不是正在做的事情。此语句来自OPs代码,*list->next=new;表示OP正在尝试附加新节点,而不是在现有节点之前插入
int main( void )
{
    struct list *list = NULL;

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

    return 0;
}