有问题的malloc

Aun*_*une -1 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;
};
Run Code Online (Sandbox Code Playgroud)

在我分配的代码中:

struct NETWORK_ENDPOINT *Endpoint = malloc(sizeof(struct NETWORK_ENDPOINT));
Run Code Online (Sandbox Code Playgroud)

然后在代码中我将分配OutboundData.

Endpoint->OutboundData = malloc(20); // malloc() size may vary, 
                                     // but in the problem situation it is 20
Run Code Online (Sandbox Code Playgroud)

然后我做:

memcpy(Endpoint->OutboundData, Data, 20); 
Run Code Online (Sandbox Code Playgroud)

然后问题:从调试器我可以看到Endpoint给定地址@ 0x1fd6,并OutboundData给出地址@ 0x1fca,所以只有12之间.不应该是至少20?

memcpy()函数然后将在填写OutboundData(可以在内存中的数据被正确地放置看到),但一旦在它通过12个字节时,它将开始覆盖该结构的开始Endpoint,破坏TypeProtocol和的一半IP,由此使得随后无用的.

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

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

Sou*_*osh 5

OutboundData的地址为@ 0x1fca,因此只有12个

为什么你对地址 感兴趣OutboundData

之后malloc(),你应该检查它的 OutboundData,但是,你不会知道分配的内存大小 '这个.

为了清楚起见,你不是要复制到地址 OutboundData,而是复制到指向的地址 OutboundData.

然后,

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

不,它不会.的地址OutboundData不同,并且所述OutboundData中使用memcpy().

恕我直言,只要

  • malloc() 是成功的
  • Data至少是大小20(对于这种情况)

memcpy()应该工作得很好.