问题描述
指针变量 PVOID lpbuffer 指向一个内存地址,
变量 GUID g = {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}};
请问如何判断 指针 lpbuffer 指向的 内容是否等于 GUID ?
问题解答
回答1:根据MSDN上GUID structure的定义
typedef struct _GUID { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8];} GUID;
GUID是一个结构体,其没有重载==运算符,所以要想比较2个GUID,要么实现==运算符,要么老老实实地逐个比较成员变量。
// PVOID lpbuffer;// GUID g = {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}};GUID *p = (GUID*)lpbuffer;BOOL flag = FALSE;if ((*p->Data1 == g.Data1) && (*p->Data2 == g.Data2) && (*p->Data3 == g.Data3)){ flag = TRUE; for(int i; i < 8; i++){ if (*p->Data4[i] != g.Data4[i]){ flag = FALSE; } }}// flag变量为比较结果回答2:
分两种情况:
地址不同,假设GUID类型重载了==运算符
if (lpbuffer != &g && *(*GUID)lpbuffer == g) {} // *为取值符,判断指针指向地址存放的值是否等于变量g
地址相同,字节数相同则相等
if (lpbuffer == &g && sizeof(*lpbuffer) == sizeof(g)) {} // &为取地址符,判断指针是否指向变量g的地址
至于GUID类型未重载==运算符但知道其内部结构的可以参见其他答主@一代键客的答案
而GUID类型未重载==运算符也不知道其内部结构我觉得可以逐个字节比较
if (sizeof(*lpbuffer) != sizeof(g)) return false; size_t size = sizeof(*lpbuffer); size_t i = 0; char* p1 = (char*)lpbuffer; char* p2 = &g; while ( i != size ) {if (*p1 != *p2) return false;p1++;p2++;i++; } return true;回答3:
if (memcmp(lpbuffer, GUID, 16) == 0) { ...}