2012-12-05 194 views
0

這是如何將值賦給自引用結構類型的對象的成員?

typedef struct treeNode 
    { 
     int data,pos; 
     char name[16]; 
     struct treeNode *left; 
     struct treeNode *right; 
    }treeNode; 

我已經創建了一個動態對象

treeNode *temp; 
      temp = (treeNode *)malloc(sizeof(treeNode)); 

如果非要賦值的數據應該怎麼分配

scanf("%d",temp->data); //or 
scanf("%d",&(temp->data)); //why? because all scanf will look for is address to a location which could be done by temp->data; 

和我的結構的Def這也適用於訪問數據也即我應該如何訪問整數部分?

temp->data; //or 
*(temp->data) 
+0

[不要強制'malloc'](http://stackoverflow.com/a/605858/1848654)。 – melpomene

回答

2

scanf("%d",&temp->data);

因爲scanf()的需要可變的地址。對於每個轉換說明符,scanf()都希望相應的參數是一個指向正確類型的指針:%d期望類型爲int *的參數,%f期望類型爲double *,%c和%s的參數都期望參數char *類型等。

Behaviour of scanf()給出了關於scanf()的更多信息。

對於訪問temp->data就足夠了,因爲它基本上等於(*temp).data

如果您嘗試訪問*(temp->data),則會觸發未定義的行爲。因爲,您正在訪問可能位於其他進程上下文中的內存位置。

說TEMP->數據是100,則*(TEMP->數據)指*(100),即,在存儲器位置訪問100

+0

temp->數據本身指的是一個地址。不是嗎? –

+0

@amitgupta:號碼 – melpomene

+1

不,它取消引用它。 – Jeyaram

0

每當你想設置傳遞的參數的值進入一個功能,你需要發送地址。由於您希望scanf填充該參數的值,因此您需要使用該地址。 (請注意,如果struct元素已經是一個指針(分配給它的內存),則不需要&)。

但是,當您想要閱讀某些內容時,不需要使用該地址。你可以直接使用它。

+0

在分配類似temp-> data的情況下,行爲是不確定的。在我的情況下,我得到了一個「訪問衝突」的運行時錯誤,這是我以前不想發生的事情。所以我想清除一些事情。 –

+0

它試圖將temp-> data中的任何值作爲指針。這幾乎總是指向與進程無關的內存,所以你將會遇到訪問衝突。 – xaxxon

相關問題