2016-08-22 64 views
1

我已經在C中創建了一個結構,並試圖以不同的方式打印結構值。爲什麼我不能在C中取消引用指向結構的指針?

#include<stdio.h> 
#include<windows.h> 
#include<tchar.h> 


#define KEY_SIZE 8 
typedef struct _TREENODE { 
    struct _TREENODE *Left, *Right; 
    TCHAR key[KEY_SIZE]; 
    LPTSTR pData; 
}TREENODE, *LPTNODE, **LPPTNODE; 

#define NODE_SIZE sizeof(TREENODE) 

int _tmain(int argc, LPTSTR argv[]) 

{ 
    LPTNODE pNode; 
    TCHAR name[]="sachin tendulkar"; 

pNode = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NODE_SIZE); 

pNode->pData = name; 

// Bothe address are same 
printf("0x%p = 0x%p\n", ((char *)pNode + 16), (&((*pNode).pData))); 

//Why does it give different value ??? 
printf("0x%p = 0x%p\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 

// ERROR !!! 
printf("0x%s = 0x%s\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 


return 0; 
} 

2個以下代碼不起作用。

printf("0x%p = 0x%p\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 

printf("0x%s = 0x%s\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 

說下面的代碼是給相同的輸出:

((char *)pNode + 16)  = (&((*pNode).pData)) 

但下面的代碼都沒有!

*((char *)pNode + 16) != *(&((*pNode).pData)) 
+1

'錯誤!!!' - 哪種錯誤?也許你應該顯示實際的輸出。 – 4386427

回答

3
//Why does it give different value ??? 
printf("0x%p = 0x%p\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 

的地址相同,但類型不會。 ((char *)pNode + 16)的類型是char *,所以當你解除引用時,你會得到一個char,它只是在調用printf()時提取LPTSTR指針的第一個字節。 &((*pNode).pData)的類型爲*LPTSTR,所以當您發現它時,會得到一個LPTSTR,所以它將完整的指針傳遞給printf()

// ERROR !!! 
printf("0x%s = 0x%s\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 

這是同樣的問題。 %s預計它的參數是一個指向空終止字符串的指針。但*((char *)pNode + 16)只是指針的一個字節,而不是整個指針。

+0

謝謝。這解決了這個問題。 printf(「0x%s = 0x%s \ n」,*((LPTSTR *)((char *)pNode + 16)),*(&((* pNode).pData))); – samanta

相關問題