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

时间:2016-08-22 08:05:39

标签: c pointers visual-c++ struct

我在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 个答案:

答案 0 :(得分:3)

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

地址相同,但类型不是。 ((char *)pNode + 16)的类型为char *,因此当您取消引用它时,您会得到char,它只会在调用{{1}时提取LPTSTR指针的第一个字节}}。 printf()的类型为&((*pNode).pData),因此当您取消它时,您会获得*LPTSTR,因此它将完整指针传递给LPTSTR

printf()

这是同样的问题。 // ERROR !!! printf("0x%s = 0x%s\n", *((char *)pNode + 16), *(&((*pNode).pData)) ); 期望它的参数是一个指向以null结尾的字符串的指针。但是%s只是指针的一个字节,而不是整个指针。