关于void * 指针运算的一个困惑的地方。

djfu 2009-03-03 02:28:56


typedef struct _MsgHead
{
int MsgLen;
int MsgType;
SOCKET sock;
} tMsgHead, *ptMsgHead;
const int Len_tMsgHead = sizeof(tMsgHead);

typedef struct _Msg
{
tMsgHead head;
void *buf;
}tMsg, *ptMsg;

#define TEST_MSG_TYPE 1000
typedef struct _TestMsg
{
int count;
DWORD dw;
char msg[32];
} tTestMsg, *ptTestMsg;

//...
int main()
{

tMsg *pMsg = (tMsg *)malloc(Len_tMsgHead + sizeof(tTestMsg));
pMsg->head.sock = 0;
pMsg->head.MsgType = TEST_MSG_TYPE;
pMsg->head.MsgLen = sizeof(tTestMsg);

tTestMsg t0;
t0.count = 0; t0.dw = 1; strcpy(t0.msg, "test only");

// 下面3条赋值语句,都是取pMsg->buf的地址,你认为哪个正确?为什么?
void *p1 = &pMsg->buf; // (1)
void *p2 = pMsg + Len_tMsgHead; // (2)
void *p3 = (char *)pMsg + Len_tMsgHead; // (3)

// 下面2条拷贝内存到pMsg->buf,哪一个正确?为什么?
memcpy(&pMsg->buf, &t0, sizeof(tTestMsg)); // (4)
memcpy(pMsg + Len_tMsgHead, &t0, sizeof(tTestMsg)); // (5)
}
...全文
131 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1楼讲得不错,第3条我补充一下,
只要

typedef struct _MsgHead
{
int MsgLen;
int MsgType;
SOCKET sock;
} tMsgHead, *ptMsgHead;
SOCKET 本身占据的空间是32bit的整数倍,那第3条操作就是对的。
pengzhixi 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
1) 正确,这个不需要解释吧?
2)这个要移动Len_tMsgHead*sizeof(tMsg)个字节,很显然不对
3)不一定对,要看你的结构中buf是不是紧跟在这个head后面的,由于字节对齐特性的存在,这个可不一定哦

所以永远用方法1,不要用其他

有了上面解释,你不需要解释4,5了吧?
[/Quote]

学习了.
xxweilw 2009-03-03
  • 打赏
  • 举报
回复
同意ls说的
arong1234 2009-03-03
  • 打赏
  • 举报
回复
1) 正确,这个不需要解释吧?
2)这个要移动Len_tMsgHead*sizeof(tMsg)个字节,很显然不对
3)不一定对,要看你的结构中buf是不是紧跟在这个head后面的,由于字节对齐特性的存在,这个可不一定哦

所以永远用方法1,不要用其他

有了上面解释,你不需要解释4,5了吧?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧