有问题的malloc

时间:2015-05-11 09:28:23

标签: c malloc

我有以下结构

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}},破坏EndpointType以及Protocol的一半,从而使其无效。

任何人都知道我在这里出错了什么?几天来一直在研究这个问题,但无论我尝试什么都不能解决这个问题......

尝试增加HEAP大小,但无论我做什么,它似乎都会在两个内存位置之间保持12个字节。

1 个答案:

答案 0 :(得分:5)

  

OutboundData的地址为@ 0x1fca,所以

之间仅为12

为什么您对 OutboundData地址感兴趣?

malloc()之后,您应该检查 OutboundData值,但是,您将不知道已分配内存的大小 '这个。

为了清楚起见,您复制到 OutboundData的地址,而是将复制到指定的地址 OutboundData

然后,

  

但是一旦它传递了12个字节,它将开始覆盖struct Endpoint的开始,破坏Type和Protocol以及IP的一半,从而使之后无用。

不,它不会。 OutboundData地址不同,OutboundData中使用memcpy()

恕我直言,只要

  • malloc()成功
  • Data至少是20(本例)

您的memcpy()应该可以正常使用。