【发布时间】:2012-05-31 19:40:07
【问题描述】:
我在旧代码库中遇到过这个源代码,但我真的不知道为什么它的行为方式如此。
在下面的代码中,pData 结构成员要么包含数据,要么包含指向共享内存中真实数据的指针。使用 IPC(msgsnd() 和 msgrcv())发送消息。使用指针转换(当前已注释掉),在 ARM 目标上使用 GCC 4.4.1 失败,成员 uLen 被修改。使用 memcpy() 时,一切都按预期工作。我真的看不出指针转换有什么问题。这里有什么问题?
typedef struct {
long mtype;
unsigned short uRespQueue;
unsigned short uID;
unsigned short uLen;
unsigned char pData[8000];
} message_t;
// changing the pointer in the struct
{
unsigned char *pData = <some_pointer>;
#if 0
*((unsigned int *)pMessage->pData) = (unsigned int)pData;
#else
memcpy(pMessage->pData, &pData, sizeof(unsigned int));
#endif
}
// getting the pointer out
{
#if 0
unsigned char *pData; (unsigned char *)(*((unsigned int *)pMessage->pData));
#else
unsigned char *pData;
memcpy(&pData, pMessage->pData, sizeof(int));
#endif
}
【问题讨论】:
-
当您提到
uLen已更改时,我不太确定您的意思。使用铸造时它会改变吗(更有可能)?或者你什么时候做memcopy()?我正在编辑你的问题,标点符号不是很清楚。