Realloc在第二次循环时停止程序

时间:2017-06-17 13:50:56

标签: c memory struct malloc realloc

我试图为我的数据结构分配一些内存(从互联网数据包中获取数据),但是我遇到了问题,我的程序停止了,当它进入第二次循环时。第一个循环完美,结构内的所有数据都是正确的。这是代码:

    struct ipOut *ipHeadr = NULL;
    struct ipAddr *addrHeadr = NULL;
    struct hexOut *hexHeadr = NULL;
    struct icmpOut *icmpHeadr = NULL;
    struct igmpOut *igmpHeadr = NULL;
    struct tcpOut *tcpHeadr = NULL;
    struct udpOut *udpHeadr = NULL;

    int main() {

ipHeadr = (struct ipOut*)malloc(sizeof(ipHeadr));
addrHeadr = (struct ipAddr*)malloc(sizeof(addrHeadr));
hexHeadr = (struct hexOut*)malloc(sizeof(hexHeadr));
icmpHeadr = (struct icmpOut*)malloc(sizeof(icmpHeadr));
igmpHeadr = (struct igmpOut*)malloc(sizeof(igmpHeadr));
tcpHeadr = (struct tcpOut*)malloc(sizeof(tcpHeadr));
udpHeadr = (struct udpOut*)malloc(sizeof(udpHeadr));

struct sockaddr saddr;
unsigned char *buff = (unsigned char *)malloc(65536);
int sock = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
if (sock < 0){
    printf ("Error creating socket");
    return 1;
}
int loop =  1;
while (loop == 1){
    int saddrLength = sizeof saddr;
    rawData = recvfrom(sock, buff, 65536, 0, &saddr, &saddrLength);
    printf("raw data %d\n", rawData);
    if(rawData <0 )
    {
        printf("Failed to get packets\n");
        return 1;
    }
    gettingPacket(buff, rawData);
}
return 0;
    }

    void gettingPacket(unsigned char * buff, int data){
packetNum++;
ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum);
addrHeadr = (struct ipAddr*)realloc(addrHeadr,sizeof(addrHeadr)*packetNum);
hexHeadr = (struct hexOut*)realloc(hexHeadr, sizeof(hexHeadr)*packetNum);
struct iphdr *iph = (struct iphdr*)buff;


switch (iph -> protocol)
{
    case 1:
        icmpNum++;
        icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr)*icmpNum);
        icmpOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 2:
        igmpNum++;
        igmpHeadr = (struct igmpOut*)realloc(igmpHeadr,sizeof(igmpHeadr)*igmpNum);
        igmpOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 6:
        tcpNum++;
        tcpHeadr = (struct tcpOut*)realloc(tcpHeadr,sizeof(tcpHeadr)*tcpNum);
        tcpPacketOutput(buff, data);
        hexDataOut(buff, data);
        break;
    case 17:
        udpNum++;
        udpHeadr = (struct udpOut*)realloc(udpHeadr, sizeof(udpHeadr)*udpNum);
        udpPacketOutput(buff, data);
        hexDataOut(buff, data);
        break;

}
    }

调试告诉代码在此行停止:

    ipHeadr = (struct ipOut*)realloc(ipHeadr, sizeof(ipHeadr)*packetNum);

我认为某处存在内存泄漏,但我无法找到它。

1 个答案:

答案 0 :(得分:0)

你没有用任何数据填充你的缓冲区,所以它们有点无用。

另外,在你对realloc的调用中:

icmpHeadr = (struct icmpOut*)realloc(icmpHeadr, sizeof(icmpHeadr) * icmpNum);
/* the size given above is wrong, sizeof(icmpHeadr) is the size of a pointer. */

您应该将缓冲区和缓冲区内的数据副本放在一起。如:

void main(..)
{
void* tmp;

/*  no need to initialize your arrays here
    a NULL value would indicate an empty array */

/*...*/

  case 1:
    /* icmpHeadr can be NULL on first call to realloc that's not a problem
       but realloc could fail if you run out of memory...
    */
    tmp = realloc(icmpHeadr, sizeof(struct icmpOut)*(icmpNum + 1));
    if (tmp)
    {
       icmpHeadr = (struct icmpOut*)tmp;
       memcpy(&icmpHeadr[icmpNum], buff, sizeof(struct icmpOut));
       ++icmpNum;
       icmpOutput(buff, data);
       hexDataOut(buff, data);
    }
    else 
    {
      /* you've ran out of memory 
         You could keep counting icmp messages
         but that would mess your array size, in case memory 
         becomes available later.

         ...or you could simply exit your app.  Avoiding running out of
         memory would necessitate a major rewrite of your app, anyway.
      */
    }
    break;