我再做程序的时候,碰到了一个这样的需求:
相一个装置发送数据,信息分为消息的一些必选字段,和一些说明语言,说明语言可多可少,要根据具体的需求。因此,我曾经写了现面的一个结构体。
typedef struct mySendMsg_t{
mySendMsg_t()
{
dwSendToID = dwSendID = nType = 0;
msg = NULL;
}
/* deleted bu nostopstep;不用再使用这段代码了
~mySendMsg_t()
{
delete []msg;
}
*/
BuildMsg(DWORD dw_RecID, DWORD dw_SendID, byte Type, char* SendMsg, DWORD dwMsglen)
{
......
//不用指针了,这行就该退休。msg = new char[dwMsglen];
memcpy(msg, SendMsg, dwMsglen);
}
DWORD dwSendToID; //接收方的ID;
DWORD dwSendID;//发送方ID;
byte nType; //消息类型;
char msg[0]; //在这里使用指针可不是好主意 nostopstep char * msg;
}t_SendMsg;
然而,再使用过程中的诸多不便,让我最后决定不用cha*,有一个最大原因就是char* 的内容和本结构体的地址不一定是连续的。当然还有其它的不便,最后,为了不大改动已经搭好的框架,有让问题能够方便解决,我把char * msg 换成了char msg[0];然后一切照旧使用只不过不用new 了,这样所遇到的问题就解决了,因此,提醒大家,再定义结构体的时候,有时候,不一定可变长度的参数就一定要使用指针。使用char msg[0];能够保证结构体的连续性。并也不会再刚开始的时候就多占用你4个字节。