Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C当使用struct*=struct时,如何从不兼容的指针类型解析赋值_C_Pointers_Struct - Fatal编程技术网

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

C当使用struct*=struct时,如何从不兼容的指针类型解析赋值,c,pointers,struct,C,Pointers,Struct,我在这些论坛上寻找问题的解决方案,但我似乎找不到我的具体解决方案 我遇到的问题是,我想实现一个链表方面,但我不关心列表的头,我只需要知道结构的顺序 总的想法是: 结构1->结构2->结构n->结构n+1 这样我就可以走了: 结构n->结构n-1 我已将我的标题定义为: typedef struct { unsigned int value; struct item* prev; } item; 我从一个简单的文件中读取多个项目值,基本上是: 23

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

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

总的想法是:

结构1->结构2->结构n->结构n+1

这样我就可以走了:

结构n->结构n-1

我已将我的标题定义为:

 typedef struct {

        unsigned int value;
        struct item* prev;


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

23
421
12
234
etc ...
我将项目加载到一个足够大的malloc'd内存区域中,当我从文件中读入它们时,我执行以下操作:

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

 for (i = 0; i < no_of_lines; i++) {
        if (fscanf(fp, "%d", &item[i] != EOF) {
      }
    }
我试过这个:

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

有什么想法吗?

问题在于这个定义:

typedef struct {
    unsigned int value;
    struct item* prev;  /* <---- here */
} item;
不同之处在于,此类型名为
struct item
,而原始类型仅为
item
,没有
struct
关键字

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

typedef struct item {
    unsigned int value;
    struct item* prev;
} item;
或者你可以在单独的声明中做,这是一样的

struct item {
    unsigned int value;
    struct item* prev;
};
typedef struct item item;
除此之外,该赋值由
运算符执行:

items[i].prev = &items[i-1];

问题在于这一定义:

typedef struct {
    unsigned int value;
    struct item* prev;  /* <---- here */
} item;
不同之处在于,此类型名为
struct item
,而原始类型仅为
item
,没有
struct
关键字

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

typedef struct item {
    unsigned int value;
    struct item* prev;
} item;
或者你可以在单独的声明中做,这是一样的

struct item {
    unsigned int value;
    struct item* prev;
};
typedef struct item item;
除此之外,该赋值由
运算符执行:

items[i].prev = &items[i-1];

你的问题可能是typedef。只需删除关键字

typedef struct {

        unsigned int value;
        struct item* prev;


    } item;
这意味着声明一个名为“item”的类型


作为一般规则:给每样东西都起一个唯一的名字。您有一个“struct item”和typedef“item”和“item=malloc”。令人困惑。

您的问题可能是typedef。只需删除关键字

typedef struct {

        unsigned int value;
        struct item* prev;


    } item;
这意味着声明一个名为“item”的类型


作为一般规则:给每样东西都起一个唯一的名字。您有一个“struct item”和typedef“item”和“item=malloc”。混乱。

项目=malloc(没有行*项目大小)首先…小心
项目
vs
项目
。一个是数组;另一种是类型。
items=malloc(无行*大小*项)首先…小心
项目
vs
项目
。一个是数组;另一个是类型。我知道,我们的老师告诉我们使用这种格式,我问过为什么有些人写typedef struct name{}name;他说别担心。也谢谢你,是不是应该是
item[i]->prev=&item[i-1]因为我们正在解引用一个指针,而不是struct的静态实例。@chrisedwards:type
typedef struct{…}name惯用语是一个非常糟糕的主意。问题是它声明的结构没有名称,然后是别名。这有一些问题:例如,许多调试器无法正确显示typedef名称。我的建议是:如果你想要一个有名字的结构,那么做一个有名字的结构:
structname{…}
@stellarhopper:No,
item
是一个指针(或者
items
,有一些打字错误),但是
item[i]
是一个结构。因此,
item[i].prev
访问该成员。@rodrigo:错误:
item
是一个typedef名称
items
是一个指针变量的名称(指向大小为item的XXX个项目),特别容易混淆,因为OP在宽限期内编辑了文章。我知道,我们的老师告诉我们使用这种格式,我问过为什么有些人写typedef struct name{}name;他说别担心。也谢谢你,是不是应该是
item[i]->prev=&item[i-1]因为我们正在解引用一个指针,而不是struct的静态实例。@chrisedwards:type
typedef struct{…}name惯用语是一个非常糟糕的主意。问题是它声明的结构没有名称,然后是别名。这有一些问题:例如,许多调试器无法正确显示typedef名称。我的建议是:如果你想要一个有名字的结构,那么做一个有名字的结构:
structname{…}
@stellarhopper:No,
item
是一个指针(或者
items
,有一些打字错误),但是
item[i]
是一个结构。因此,
item[i].prev
访问该成员。@rodrigo:错误:
item
是一个typedef名称
items
是一个指针变量(指向大小为item的XXX项)的名称,特别容易混淆,因为OP在宽限期内编辑了文章。