-2

在我用 C 编写的代码中使用运算符 '->' 时,我得到了这种奇怪的副作用。我使用 -> on 的指针被更改为有一些垃圾。

进一步来说:

我有以下结构:

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 在标记的上述行上发生了变化。

我真的不知道为什么,我不知道'->'会产生副作用

提前致谢

4

3 回答 3

9

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

typedef struct Node_t* Node;

Node* head =list->head; 

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

Node head =list->head; 

编辑

总结一下,我认为这个 typedef 误导了你:

typedef struct Node_t* Node;

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

typedef struct Node_t Node;
于 2011-04-21T20:34:48.840 回答
4

啊,隐藏在 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'。类型似乎都匹配。运营商最->强调没有任何副作用;它所做的只是取消引用一个指针。headfor和currentin的额外间接级别struct List_t令人头疼,这让我想知道它们是否被正确分配或分配。我所能想到的是,它list->head并没有指向您实际拥有的内存,并且当您达到该点时会以某种方式被覆盖(IOW,您在代码中的其他地方调用了未定义的行为)。

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

于 2011-04-21T21:12:50.917 回答
1

您正在使用指向指针的指针,其中最有可能需要指针。

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

hth

马里奥

于 2011-04-21T20:38:32.593 回答