我是C的新蜜蜂。我目前在C中编写链表。在编译时,它一直在抱怨“从不兼容的指针类型中分配”。我的代码是这样的:
# include <stdio.h>
#include <stdlib.h>
struct snode{
struct snode *next;
int val;
};
struct slist{
struct snode *head;
struct snode *tail;
int len;
};
struct slist *mylist;
void slist_insert(int v){
struct snode *newnode;
newnode = (struct snode*)malloc(sizeof(struct snode));
newnode -> val = v;
newnode -> next = NULL;
if(mylist->head = NULL){
mylist->head = malloc (sizeof(struct snode));
mylist->tail = (struct snode*)malloc (sizeof(struct snode));
mylist->head = newnode;
mylist->tail = newnode;
};
else{
mylist -> tail -> next = (struct snode*)malloc (sizeof(struct snode));
mylist -> tail -> next = newnode;
};
mylist -> len +=1;
};
main(){
slist_insert(1);
slist_insert(2);
slist_insert(3);
slist_insert(4);
slist_insert(5);
struct snode *temp;
temp = (struct snode*)malloc(sizeof(struct snode));
temp = mylist-> head;
while(temp -> next != NULL){
printf("%d\n", temp -> val);
temp = temp -> next;
};
};
这是修改过的。我正在使用linux终端来运行这个程序。我使用的编译器是gcc -std = gnu99
slist.c: In function â:
slist.c:32: error: â without a previous â
slist.c: At top level:
slist.c:40: warning: return type defaults to â
答案 0 :(得分:4)
此代码存在许多问题。我仅列出导致“从不兼容指针分配”警告的问题。使用gcc -W -Wall
进行编译并修复所有警告。在你完成之后,仍然会有错误。
您需要#include <stdlib.h>
,在现有#include <stdio.h>
之后,才能使malloc
的声明可见。 (如果不这样做,编译器必须假设malloc
返回int
,即使它完全清楚这是错误的。这就是“incompatible implicit declaration of built-in function ‘malloc’
”警告试图告诉你。)
您错误地将struct snode
分配投放到struct slist *
,然后在几个地方将它们分配到struct snode *
字段。不要将malloc
的返回值强加给任何东西;只是分配它。 (请注意,您可能会看到有人在代码中故意将malloc
的返回值转换为需要编译为C ++和C的代码。不要这样做,直到您有足够的经验来理解如果有必要的话。如果编译器坚持将所有内容都视为C ++,即使它是C语言,也可以使用更好的编译器。)
struct snode
的{{1}}字段应声明为next
,而不是struct snode *
。
答案 1 :(得分:2)
你的next
是指向int的指针,而你希望它是指向struct snode的指针。
此外,我假设你的mylist
是一个slist而不是指向slist的指针。正如在评论中已经指出的那样,那个mylist的元素不一定是初始化的(实现依赖。使用指针用于mylist的模式,你需要malloc(和init)那个人首先...