为什么我不能在C中取消引用指向结构的指针?

问题描述:

我已经在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

//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