C 为什么不能像这样访问链表中的指针?

C 为什么不能像这样访问链表中的指针?,c,linked-list,C,Linked List,我声明节点如下: typedef struct slinkedlist { int data; struct slinedlist *next; } node; 我的代码中有临时指针node*tmp,为什么我不能访问tmp->next->next /*添加代码*/ typedef struct slinkedlist { int data; struct slinedlist *next; } node; node *s

我声明节点如下:

typedef struct slinkedlist {
    int data;
    struct slinedlist *next;
} node;
我的代码中有临时指针
node*tmp
,为什么我不能访问
tmp->next->next

/*添加代码*/

   typedef struct slinkedlist {
        int data;
        struct slinedlist *next;
    } node;


    node *start;

/* Assume I have 5 nodes in a list */

    void ex(void)
    {
        node *tmp;

        tmp = start->next->next; /* This will be error in C , explain me, why? */

        /* But this works fine */
        tmp = start->next;
        tmp = tmp->next;
    }

为什么我访问start->next->next时会出错?

一旦tmp指向最后一个节点,tmp->next将为空,这样tmp->next->next将导致空指针取消引用。

尝试时会发生什么?你收到错误信息了吗?什么?这样您就有取消引用空指针的危险。您为指针分配了内存,而不是为结构分配了内存。为什么您认为这是不可能的?如果可以确保指针有效,就可以访问这样的指针。但这是不可取的。也许这只是一个输入错误:
slinedlist
->
slinkedlist
?只是为了澄清一下。。。你说的错误是指分段错误吗?无论如何,因为两个tmp=start->next->next;tmp=开始->下一步;tmp=tmp->next;逻辑上是一样的,我只能想到最后一个解释:编译器优化前者,导致在第一次和第二次解引用之间执行无序。检查问题是否确实存在的一种方法是查看生成的汇编代码。如果前者导致连续关闭的解引用,则无序执行将导致seg故障。在这种情况下,这是一个编译器错误。使用tmp保存第一次解引用的结果将导致对相距更远的汇编指令的解引用,这将确保在尝试第二次解引用之前已完成第一次解引用。