C当使用struct*= struct时,如何解决不兼容指针类型的赋值问题

chr*_*rds 0 c struct pointers

我在这些论坛上搜寻了一个寻找问题的解决方案,但我似乎找不到我的具体解决方案.

我遇到的问题是,我想实现一个链表方面,但我并不关心列表的头部,我只需要知道结构的顺序.

一般的想法是:

struct 1 - > struct 2-> struct n-> struct n + 1

所以我可以去:

struct n - > struct n-1 ........

我已经定义了我的标题:

 typedef struct {

        unsigned int value;
        struct item* prev;


    } item;
Run Code Online (Sandbox Code Playgroud)

我从一个简单的文件读取多个项目值,基本上是:

23
421
12
234
etc ...
Run Code Online (Sandbox Code Playgroud)

我将项目加载到malloc内存区域足够大,当我从文件中读取它时,我这样做:

item* items;
items = malloc(no_of_lines * sizeof(item));

 for (i = 0; i < no_of_lines; i++) {
        if (fscanf(fp, "%d", &item[i] != EOF) {
      }
    }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将前一个项目分配给项目时:

for (i = 0; i < no_of_lines; i++){
   if(i != 0){
      item[i].prev = item[i-1];
      }
 }
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

incompatible types when assigning to type ‘struct item *’ from type ‘item’
Run Code Online (Sandbox Code Playgroud)

我试过这个:

for (i = 0; i < no_of_lines; i++){
       if(i != 0){
          item[i].prev = &item[i-1];
          }
     }
Run Code Online (Sandbox Code Playgroud)

for (i = 0; i < no_of_lines; i++){
           if(i != 0){
              item[i].prev = (item *)&item[i-1];
              }
         }
Run Code Online (Sandbox Code Playgroud)

两者都产生警告:

assignment from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

rod*_*igo 5

问题出在这个定义中:

typedef struct {
    unsigned int value;
    struct item* prev;  /* <---- here */
} item;
Run Code Online (Sandbox Code Playgroud)

该行声明指向此结构的指针,因为item直到完整声明结束才会引入该名称.这实际上是一个无名结构,带有一个名为的别名item.在某个地方你有另一个,也许是类似的结构,命名为item:

struct item {
     //unknown contents (for me)
};
Run Code Online (Sandbox Code Playgroud)

不同之处在于,此类型是struct item在原始类型的情况下命名的item,没有struct关键字.

如果它们不相同,您应该以不同的名称命名,以避免混淆.如果它们实际上是相同的,则应删除其中一个声明.请注意,您可以同时声明命名结构和别名,然后它们将引用相同的类型:

typedef struct item {
    unsigned int value;
    struct item* prev;
} item;
Run Code Online (Sandbox Code Playgroud)

或者你可以在单独的声明中完成它,它也是一样的;

struct item {
    unsigned int value;
    struct item* prev;
};
typedef struct item item;
Run Code Online (Sandbox Code Playgroud)

除此之外,分配与&运营商:

items[i].prev = &items[i-1];
Run Code Online (Sandbox Code Playgroud)