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

标签 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))

最佳答案

//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 期望它的参数是指向以 null 结尾的字符串的指针。但是 *((char *)pNode + 16) 只是指针的一个字节,而不是整个指针。

关于c - 为什么我不能在 C 中取消引用指向结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39074218/

相关文章:

使用 PIC18 单片机创建文件

c - C 中的平方和程序,方程 z = x^2 + y^2

c - 将双指针(动态分配的双数组)传递给函数

c# - 如何在 C# 中返回字符串列表

c - 将字符串中的最后一个字符设置为 0 会导致程序崩溃

c++ - 使用 fread/fwrite 将文件复制到 USB 的性能

c - 关于 C 中的二维数组指针

c - int *p; 有什么问题? *p=23;

c++ - 为什么我对 operator* 的使用失败了?

c++ - 引用 VC++ 代码或转换为 DLL?