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