我在这些论坛上搜寻了一个寻找问题的解决方案,但我似乎找不到我的具体解决方案。
我遇到的问题是,我想实现链表方面,但我不关心列表的头部,我只需要知道结构的顺序。
一般的想法是:
struct 1 - >结构2-> struct n-> struct n + 1
所以我可以去:
struct n - > struct n-1 ........
我已将我的标题定义为:
typedef struct {
unsigned int value;
struct item* prev;
} item;
我从一个简单的文件读取多个项目值,基本上是:
23
421
12
234
etc ...
我将项目加载到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) {
}
}
但是当我尝试将之前的内容分配给某个项目时:
for (i = 0; i < no_of_lines; i++){
if(i != 0){
item[i].prev = item[i-1];
}
}
我收到此错误:
incompatible types when assigning to type ‘struct item *’ from type ‘item’
我试过这个:
for (i = 0; i < no_of_lines; i++){
if(i != 0){
item[i].prev = &item[i-1];
}
}
和
for (i = 0; i < no_of_lines; i++){
if(i != 0){
item[i].prev = (item *)&item[i-1];
}
}
都会产生警告:
assignment from incompatible pointer type
有什么想法吗?
答案 0 :(得分:5)
问题出在这个定义中:
typedef struct {
unsigned int value;
struct item* prev; /* <---- here */
} item;
该行不是声明指向此结构的指针,因为在完整声明结束之前不会引入名称item
。这实际上是一个无名结构,其别名为item
。在某处你有另一个,也许是类似的结构,名为item
:
struct item {
//unknown contents (for me)
};
区别在于此类型的名称为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];
答案 1 :(得分:0)
您的问题可能是typedef。只需删除关键字。
typedef struct {
unsigned int value;
struct item* prev;
} item;
这意味着声明一个名为'item'的类型。
作为一般规则:给一切都一个独特的名字。你有一个'struct item'和typedef'item'和'item = malloc'。混乱。