使用运算符' - >'时会出现这种奇怪的副作用在我用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在标记的前述行上被更改。
我真的不知道为什么,而且我不知道' - >'可能有副作用
提前致谢
答案 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
current
中struct List_t
和list->head
的额外间接级别是令人头疼的问题,这让我想知道它们是否被正确分配或分配。我可以想到的是{{1}}并没有指向你实际拥有的内存,并且当你到达那个点时会以某种方式被覆盖(IOW,你在代码中的其他地方调用了未定义的行为)。
简而言之,问题不在于您发布的代码中。它可能是您分配和分配列表元素的地方。
答案 2 :(得分:1)
你正在使用指针指针,你很可能想要指针。
在List_t中,您将head定义为Node *,其中Node已经是Node_t *。
HTH
马里奥