2012-05-16 58 views
1

我試圖實現一個通用的鏈表。該節點的結構如下: -解引用C++中的空指針

typedef struct node{ 
     void *data; 
     node *next;  
}; 

現在,當我嘗試分配一個地址數據,假設例如一個整型,像 -

int n1=6; 
node *temp; 
temp = (node*)malloc(sizeof(node)); 
temp->data=&n1; 

我如何獲得節點n1的值?如果我說 -

cout<<(*(temp->data)); 

我得到 -

`void*' is not a pointer-to-object type 

不空指針得到類型強制轉換成int指針類型的時候我給你INT的地址呢?

+3

爲什麼在C++程序中使用malloc和C風格的指針? –

+0

如果這不是鍛鍊,請停止重新發明車輪並使用例如鏈接列表[glib]中提供(http://developer.gnome.org/glib/2.32/glib-Singly-Linked-Lists.html) – Bort

+0

@PaulRL該OP在他的問題標題中提到C作爲實現的語言。 – dirkgently

回答

6

您必須首先將void*轉換爲實際有效的指針類型(例如int*),以告知編譯器您期望解除引用多少內存。

+0

因此,在通用鏈接列表的情況下,每個節點都有不同類型的數據,如int或char或char *。那麼,爲了獲得我需要的每個數據的值,以便進行類型轉換?這意味着我不能遍歷鏈表並以通用方式獲取數據值? – theharshest

+0

您需要強制類型轉換(瞭解基礎類型)或創建一個知道基礎類型並可以正確返回其值的通用容器。 –

+0

@theharshest,對於通用鏈表,您應該使用模板化構造,例如'std :: list' – iammilind

2

void指針不能被解除引用。您需要將其轉換爲合適的非空指針類型。在這種情況下,int*

cout << *static_cast<int*>(temp->data); 

由於這是C++,你應該使用C++蒙上而不是C風格的強制轉換。而且你不應該在C++等中使用malloc等。

+0

...如果你正在寫一個「通用」鏈表,你應該使用泛型。或者我們稱之爲模板。 :-) –

+0

我想知道爲什麼這個答案和被接受的答案已經降低。 –

+0

我認爲這可能是因爲即使您在提問時完全正確地回答了問題,但使用該答案仍然會以血腥的可怕代碼結束! :-) –

2

void指針不能被解除引用。您需要將其轉換爲合適的非空指針類型。現在的問題是關於C++的,所以我建議你使用模板來實現你的目標考慮:

template <typename T> struct node 
{ 
    T *data; 
    node<T> *next;  
}; 

則:

int n1=6; 
node<int> *temp = new node<int>(); 
temp->data=&n1; 

最後:

cout << (*(temp->data)); 

鑄字是可能的,但是這將是一個C風格的類型不安全的解決方案,而不是C++。

+2

'typedef'在C++中是不必要的,因爲我們正在使用模板...另外,數據是'T *'似乎沒用,簡單的'T'就足夠了。 –

+1

固定。 T *由原作者提供。 –

+0

另外,使用'std :: unique_ptr > next;'(或最好是'boost :: optional > next;')來代替。第一個節點不需要動態分配;只需使用'node temp;'。 – 2012-05-16 11:08:10

0

將類型temp-> data轉換爲int然後打印。

cout<<*((int *)temp->data);