2017-06-17 66 views
0

我試圖分配一些內存爲我的數據結構(您可以通過因特網分組數據),但我所面臨的問題,我的程序只是停止,當它來回第二個循環。第一個循環變得完美,結構中的所有數據都是正確的。下面是代碼: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); 

我認爲有內存泄漏的地方,但我不能找到它。

+2

提示'type * pointer = malloc(sizeof(* pointer));','sizeof(pointer)'是指針大小。 'sizeof(Type)'或'sizeof(* pointer)'是類型大小。 – BLUEPIXY

+0

不要投放'malloc'和朋友的結果! – Olaf

+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. */ 

你應該在緩衝區內保存的realloc和數據的副本。如:

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;