为什么我必须创建一个临时引用来在 C 中打印类似:'(e1->next)->content' 的内容?
Why do I have to create a temporary reference to print something like: '(e1->next)->content' in C?
#include <stdio.h>
#include <stdlib.h>
typedef struct ListElemStruct {
int content;
ListElem next;
} *ListElem;
ListElem mkListElem(int content);
int main(void) {
ListElem e1 = mkListElem(1);
e1->next = mkListElem(2);
printf("%d\n", e1->next->content);
return 0;
}
ListElem mkListElem(int content) {
ListElem new = calloc(1, sizeof(*ListElem));
new->content = content;
new->next = NULL;
return new;
}
错误信息:
c(6): warning undefined type or identifier (assuming int):_ListElem
c(13): warning different types in assignment (possibly loss of data)
c(13): warning assigning pointer type to non-pointer type
c(15): error _content not a member of _e1
它有效,如果我这样写:
ListElem tmp = e1->next;
printf("%d\n", tmp->content);
我不明白这里的问题。
为什么带有 2 个“->”运算符的选项不起作用,有没有更简单的方法来打印下一个 ListElem 的内容而不是使用 'ListElem tmp'?
我现在明白为什么带有 2 个“->”运算符的选项不起作用,并且有人告诉我,我不应该在顶部的 ListElemStruct 声明中引用 ListElem。
那么我该如何声明我的 ListElemStruct?
如评论(@Eric Postpischil、@dialer)中所述,错误是由于在声明之前使用 ListElem
造成的。这导致 Virtual-C 编译器假设 next
是一个 ìnt
,然后使用 ListElem tmp = e1->next;
.
将其隐式转换为正确的类型
更好地编写我的 ListElemStruct 的解决方案(由@Eric Postpischil 提供):
typedef struct ListElemStruct {
int content;
struct ListElemStruct *next;
} *ListElem;
#include <stdio.h>
#include <stdlib.h>
typedef struct ListElemStruct {
int content;
ListElem next;
} *ListElem;
ListElem mkListElem(int content);
int main(void) {
ListElem e1 = mkListElem(1);
e1->next = mkListElem(2);
printf("%d\n", e1->next->content);
return 0;
}
ListElem mkListElem(int content) {
ListElem new = calloc(1, sizeof(*ListElem));
new->content = content;
new->next = NULL;
return new;
}
错误信息:
c(6): warning undefined type or identifier (assuming int):_ListElem
c(13): warning different types in assignment (possibly loss of data)
c(13): warning assigning pointer type to non-pointer type
c(15): error _content not a member of _e1
它有效,如果我这样写:
ListElem tmp = e1->next;
printf("%d\n", tmp->content);
我不明白这里的问题。
为什么带有 2 个“->”运算符的选项不起作用,有没有更简单的方法来打印下一个 ListElem 的内容而不是使用 'ListElem tmp'?
我现在明白为什么带有 2 个“->”运算符的选项不起作用,并且有人告诉我,我不应该在顶部的 ListElemStruct 声明中引用 ListElem。
那么我该如何声明我的 ListElemStruct?
如评论(@Eric Postpischil、@dialer)中所述,错误是由于在声明之前使用 ListElem
造成的。这导致 Virtual-C 编译器假设 next
是一个 ìnt
,然后使用 ListElem tmp = e1->next;
.
更好地编写我的 ListElemStruct 的解决方案(由@Eric Postpischil 提供):
typedef struct ListElemStruct {
int content;
struct ListElemStruct *next;
} *ListElem;