C当使用struct*=struct时,如何从不兼容的指针类型解析赋值
我在这些论坛上寻找问题的解决方案,但我似乎找不到我的具体解决方案 我遇到的问题是,我想实现一个链表方面,但我不关心列表的头,我只需要知道结构的顺序 总的想法是: 结构1->结构2->结构n->结构n+1 这样我就可以走了: 结构n->结构n-1 我已将我的标题定义为: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
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:typetypedef 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:typetypedef struct{…}name在我看来,代码>惯用语是一个非常糟糕的主意。问题是它声明的结构没有名称,然后是别名。这有一些问题:例如,许多调试器无法正确显示typedef名称。我的建议是:如果你想要一个有名字的结构,那么做一个有名字的结构:structname{…}
@stellarhopper:No,item
是一个指针(或者items
,有一些打字错误),但是item[i]
是一个结构。因此,item[i].prev
访问该成员。@rodrigo:错误:item
是一个typedef名称items
是一个指针变量(指向大小为item的XXX项)的名称,特别容易混淆,因为OP在宽限期内编辑了文章。