我在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))
答案 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
只是指针的一个字节,而不是整个指针。