2011-04-21 40 views
-2

我得到這個奇怪的副作用,而在我用C編寫的代碼中使用運算符' - >'。我使用的指針 - > on,被改爲有一些垃圾。奇怪的副作用使用運算符' - >'在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; 
} 

當我用調試器我想通了在標記的上述行上指針列表 - >頭部被改變。

我真的不知道爲什麼,我不知道「 - >」可以有副作用

在此先感謝

+0

很可能你誤解了發生的事情。 – NPE 2011-04-21 20:34:05

+1

不, - >在C中沒有副作用。爲什麼不只是做'return list-> head-> data'? – Brad 2011-04-21 20:34:22

+7

這是你的代碼,而不是' - >'的「副作用」。這很確定。 – meagar 2011-04-21 20:34:27

回答

4

爾加,指針隱藏的typedef後面;除非該類型意味着完全不透明,這幾乎總是不好的。爲了我的好處,我將去掉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'。類型都可以匹配。 ->運營商最着重有任何副作用;它所做的只是取消引用一個指針。 headcurrentstruct List_t的額外間接水平是一個令人頭疼的問題,它讓我懷疑他們是否被正確分配或分配。我所能想到的是,list->head並不是指向你實際擁有的內存,而是在達到那個點時被不知何故覆蓋(IOW,你在代碼中的其他地方調用了未定義的行爲)。

總之,問題不在於您發佈的代碼中。這可能是你分配和分配列表元素的地方。

+0

謝謝,這就是我正在尋找的答案 – RanZilber 2011-04-22 07:15:58

9

你確定這正是你想做什麼?

typedef struct Node_t* Node; 

Node* head =list->head; 

既然你定義節點爲指針Node_t,你不應該做:

Node head =list->head; 

編輯

總結了整個事情,我覺得這是的typedef誤導你:

typedef struct Node_t* Node; 

它會更有意義如果它是簡單的:

typedef struct Node_t Node; 
+1

這聽起來是對的:否則,你會得到一個Node_t **。 – SolarBear 2011-04-21 20:35:53

+0

@karlphillip - 看看結構。我決定在list_t struct Node *變量中,而不是Node中。 – RanZilber 2011-04-21 20:36:43

+1

我覺得卡爾有這個;您正在使用節點*,它是指針的地址,而不是指向該列表地址的指針值。 – Jess 2011-04-21 20:39:07

1

您正在使用指針指針,最有可能你想指針。

在List_t中,將head定義爲Node *,其中Node已經是Node_t *。

HTH

馬里奧

+0

這不就是我在4分鐘前在我的回答中發佈的內容嗎? = P – karlphillip 2011-04-21 20:39:43

+0

@Mario勺子 - 我被要求建立這樣的列表。我知道它的奇怪和更好的解決方案將是用一個指針來構建它 - 但是這個解決方案是有限的。爲什麼這應該是一個問題? – RanZilber 2011-04-21 20:40:32

+0

@karlphillip:grrrrrrrrrr ;-) – 2011-04-21 20:40:57