我有以下结构
struct NETWORK_ENDPOINT {
unsigned char Type;
unsigned char Protocol;
unsigned char IPv4[IPV4SIZE + 1];
unsigned int PortNumber;
unsigned char SocketIndex;
unsigned char RESERVED;
unsigned char *InboundData;
unsigned int InboundDataSize;
unsigned char *OutboundData;
unsigned int OutboundDataSize;
};
在我分配的代码中:
struct NETWORK_ENDPOINT *Endpoint = malloc(sizeof(struct NETWORK_ENDPOINT));
然后在代码中我将OutboundData分配给。
Endpoint->OutboundData = malloc(20); // malloc() size may vary,
// but in the problem situation it is 20
然后我这样做:
memcpy(Endpoint->OutboundData, Data, 20);
然后问题:从调试器我可以看到Endpoint
被赋予地址@ 0x1fd6,OutboundData
被赋予地址@ 0x1fca,所以只有12之间。不应该是至少20?
然后memcpy()
函数将填入OutboundData
(可以在内存中看到数据被正确放置),但是一旦它传递了12个字节,它将开始覆盖结构的开始{{ 1}},破坏Endpoint
和Type
以及Protocol
的一半,从而使其无效。
任何人都知道我在这里出错了什么?几天来一直在研究这个问题,但无论我尝试什么都不能解决这个问题......
尝试增加HEAP大小,但无论我做什么,它似乎都会在两个内存位置之间保持12个字节。
答案 0 :(得分:5)
OutboundData的地址为@ 0x1fca,所以
之间仅为12
为什么您对 OutboundData
的地址感兴趣?
在malloc()
之后,您应该检查 OutboundData
的值,但是,您将不知道已分配内存的大小 '这个。
为了清楚起见,您不将复制到 OutboundData
的地址,而是将复制到指定的地址 OutboundData
。
然后,
但是一旦它传递了12个字节,它将开始覆盖struct Endpoint的开始,破坏Type和Protocol以及IP的一半,从而使之后无用。
不,它不会。 OutboundData
的值和地址不同,OutboundData
中使用memcpy()
的值
恕我直言,只要
malloc()
成功Data
至少是20
(本例)您的memcpy()
应该可以正常使用。