当我试图编译以下代码时,我得到了错误
test.c: In function 'main':
test.c:16: error: incompatible types in assignment
代码是..
#include <stdio.h>
#include <ctype.h>
#include <string.h>
typedef struct {
char name[20];
struct planet* next;
} planet;
int main(int argc, char *argv[])
{
planet *p, *start, *first, *second, *third;
strcpy(start->name, "Suthan");
start->next = *first;
}
1)为指针分配一些内存。
planet *start, *first; these are uninitialized pointers.
start->next // that's dereferencing an uninitialized pointer.
2) 您正在将start->next(指向行星的指针)设置为延迟指针first
。这就是你错误的根源。
start->next = *first; // should be = first;
3) 移动typedef名称以消除您看到的警告。
typedef struct planet{
char name[20];
struct planet* next;
};
planet
(*first
)的实例分配给指向planet
(start->next
)的指针。
试试这个:
start->next = first;
然而,我也想知道你对planet
的申报。这有帮助吗?
typedef struct _planet {
char name[20];
struct _planet* next;
} planet;
我认为你的结构做得不对
typedef struct _planet {
char name[20];
struct _planet* next;
} planet;
应为:
typedef struct planet {
char name[20];
struct planet* next;
}
我记得我被自引用结构的这一方面绊倒了。
typedef struct {
char name[20];
struct planet* next; /* <-- the trouble is here */
} planet;
在结构定义的中间,也就是typedef定义的中心,编译器不知道struct planet
是什么样子,但很乐意让你定义一个指向它的指针。在你取消引用*next
之前,编译器并不需要知道它是什么样子。当你到达main()
的主体时,你仍然没有告诉编译器什么是struct planet
,只有一个名为planet
的类型,它恰好是一个未命名的结构。
考虑以下方法。
struct foo {
int bar;
};
typedef struct foo foo_type;
struct foo bar;
foo_type baz;
这表明结构体的名称是foo
,定义的类型的名称为foo_type
。我可以这样组合它们:
typedef struct foo {
int bar;
} foo_type;
您可以通过在内联结构定义中添加一个伪名称来解决编译器警告。
typedef struct planet_struct {
char name[20];
struct planet_struct* next;
} planet;
你还需要解决其他人指出的内存分配问题,但这回答了你实际上没有问的问题。