这种指针怎么求解出来的?
代码来自一个demo里的片段,不发完整的了
windows里的一个宏
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(UINT_PTR)(&((type *)0)->field)))
struct CIOCPBuffer
{
WSAOVERLAPPED ol;
SOCKET sClient;// AcceptEx接收的客户方套节字
char *buff;// I/O操作使用的缓冲区
int nLen;// buff缓冲区(使用的)大小
ULONG nSequenceNumber;// 此I/O的序列号
int nOperation;// 操作类型
#define OP_ACCEPT1
#define OP_WRITE2
#define OP_READ3
CIOCPBuffer *pNext;
};
CIOCPBuffer* pBuffer = NULL;
LPOVERLAPPED lpol;
经过一些列操作后,lpol指向一块内存,这里就省去调用代码
.......
pBuffer = CONTAINING_RECORD(lpol, CIOCPBuffer, ol); 这句代码是什么意思?
ULONG_PTR
//
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif
[解决办法]
偏差==(unsigned long)(&(s->field)) -(unsigned long)&s
==(unsigned long)&s+(unsigned long)(&(((type *)0)->field)) -(unsigned long)&s
== (unsigned long)(&(((type *)0)->field))