使用运算符' - >'的奇怪副作用在c

时间:2011-04-21 20:29:01

标签: c pointers linked-list side-effects

使用运算符' - >'时会出现这种奇怪的副作用在我用C写的代码中。我使用的指针 - >在,改变了有一些垃圾。

更具体地说:

我有以下结构:

typedef void* ListElement ;

typedef  struct List_t* List ;

typedef struct Node_t* Node;

Struct Node_t {
  ListElement data ;
  Node next;
}

Struct List_t {
  Node* head;
  Node* current
}

当我使用以下ListGetFirst()时,我得到了有线行为:

ListElement ListGetFirst(List list)
{
  if( list == NULL || list->head==NULL)
  {
    return NULL;
  }
  list->current=list->head;
  Node* head =list->head; // here is the problem
  ListElement data = (*head)->data;
  return data;
}

当我使用调试器时,我发现指针list-> head在标记的前述行上被更改。

我真的不知道为什么,而且我不知道' - >'可能有副作用

提前致谢

3 个答案:

答案 0 :(得分:9)

你确定这正是你想要做的吗?

typedef struct Node_t* Node;

Node* head =list->head; 

由于您将Node定义为指向Node_t的指针,因此您不应该这样做:

Node head =list->head; 

修改

总结一下,我认为这种类型的错误会误导你:

typedef struct Node_t* Node;

如果它只是简单的话会更有意义:

typedef struct Node_t Node;

答案 1 :(得分:4)

Gah,隐藏在typedef后面的指针;除非这种类型的意思是完全不透明,否则几乎总是坏的juju。为了我的利益,我将取出typedef,这样我就可以更轻松地看到你真正玩的是什么。

struct Node_t {   
  void *data ;   
  struct Node_t *next; 
};

struct List_t {   
  struct Node_t **head;   
  struct Node_t **current; 
};

void *ListGetFirst(struct List_t *list)
{
  if( list == NULL || list->head==NULL
  {        
     return NULL;
  }
  list->current=list->head;             
  struct Node_t **head =list->head; // here is the problem
  void *data = (*head)->data;
  return data;           
}           

我得到了nuthin'。所有类型似乎都匹配。 ->运算符最强调不会有任何副作用;它只是取消引用一个指针。 head currentstruct List_tlist->head的额外间接级别是令人头疼的问题,这让我想知道它们是否被正确分配或分配。我可以想到的是{{1}}并没有指向你实际拥有的内存,并且当你到达那个点时会以某种方式被覆盖(IOW,你在代码中的其他地方调用了未定义的行为)。

简而言之,问题不在于您发布的代码中。它可能是您分配和分配列表元素的地方。

答案 2 :(得分:1)

你正在使用指针指针,你很可能想要指针。

在List_t中,您将head定义为Node *,其中Node已经是Node_t *。

HTH

马里奥