2016-12-14 92 views
-2

我宣布节点如下,为什么不能像这样访问链表中的指针?

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; 
    } 

为什么我会得到错误,如果我访问开始 - >下一步 - >下?

+3

当你尝试时会发生什么?你有错误信息吗?什么? –

+1

这样你就有空指针解引用的危险。 – werediver

+0

您为指针分配的内存不是用于结构体 –

回答

1

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

+0

在我的代码中添加了代码,请检查 –

+0

只是为了澄清...错误,是否意味着分段错误?无论如何,既然tmp = start-> next-> next;和tmp = start-> next; TMP = TMP->下;在逻辑上是相同的,我只能想到最后一个解释:编译器优化前者,导致第一个和第二个解除引用之间的乱序执行。 –

+0

检查是否确实是问题的一种方法是查看生成的汇编代码。如果前者导致相继关闭的解引用,那么乱序执行将导致段错误。在这种情况下,这是一个编译器错误。 –

相关问题