为什么我必须创建一个临时引用来在 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;