0

当我尝试编译以下代码时,出现错误

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;

}
4

4 回答 4

3

1)为您的指针分配一些内存。

planet *start, *first; these are uninitialized pointers.

start->next // that's dereferencing an uninitialized pointer.

2)您正在将 start->next (指向行星的指针)设置为 deferenced pointer first。这就是你错误的根源。

start->next = *first;  // should be  = first;

3) 移动 typedef 名称以消除您看到的警告。

typedef struct planet{
   char name[20];
   struct planet* next;
};
于 2012-12-10T19:54:48.703 回答
1

因为试图将 () 的实例分配给指向 ( ) 的planet指针。*firstplanetstart->next

试试这个:

start->next = first;

但是,我也想知道您的planet. 这有帮助吗?

typedef struct _planet {
    char name[20];
    struct _planet* next;
} planet;
于 2012-12-10T19:55:27.340 回答
0

我认为你的结构不正确

typedef struct _planet {
    char name[20];
    struct _planet* next;
} planet;

应该:

typedef struct planet {
char name[20];
struct planet* next;
}
于 2012-12-10T20:05:54.100 回答
0

我记得在自引用结构的这方面绊倒了。

typedef struct {
    char name[20];
    struct planet* next; /* <-- the trouble is here */
} planet;

在 struct 定义的中间,也就是 typedef 定义的中间,编译器不知道 astruct planet长什么样,但很乐意让你定义一个指向它的指针。在您取消引用之前,编译器并不真正需要知道它的样子*next。当你到达你的主体时,main()你还没有告诉编译器 astruct 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;

您还需要解决其他人指出的内存分配问题,但这回答了您实际上并未提出的问题。

于 2012-12-10T20:15:36.723 回答