2013-11-22 51 views
-2

我正在寫郵件服務器的日誌文件searchprogramm。我有另一個結構鏈接裏面的eine結構。我的func將TimeStamp的數據,MailserverIp,特定的MailId放入單鏈表中。此外,我有一個接收器列表,我也想把它放在一個單鏈表中,它是第一個單鏈表中的一個指針。 (鏈表內部的鏈表)鏈接列表中的C鏈接列表,segfault在第二個列表中的閱讀

我所做的結構如下:

struct SearchEntry{ 
    int headindex; 
    char *TimeStamp; 
    char *IP; 
    struct Empfaenger *nextE;  
    struct Empfaenger *anfangE; 
    char *MailId; 
    struct SearchEntry *next; 
}; 

struct Empfaenger{ 
    int headindex; 
    char *Empfaenger; 
    struct Empfaenger *nextE; 
}; 

這是把兩個列表中的數據的功能:

void write_list(char *TimeStamp, char *IP, char *Empfaenger, char *MailId){ 
    printf("MailID: %s\n", MailId); 
    if(anfang==NULL){ 
     if((anfang=malloc(sizeof(struct SearchEntry)))==NULL){ 
      fprintf(stderr, "Kein Speicherplatz vorhanden für Anfang\n"); 
      return; 
     } 
     printf("starta!\n"); 
     anfang->TimeStamp=malloc(sizeof(char)*strlen(TimeStamp)); 
     anfang->IP=malloc(sizeof(char)*strlen(IP)); 
     anfang->MailId=malloc(sizeof(char)*strlen(MailId)); 
     strcpy(anfang->TimeStamp, TimeStamp); 
     strcpy(anfang->IP, IP); 
     strcpy(anfang->MailId, MailId); 
     headindexcounter=0; 
     anfang->headindex=headindexcounter; 
     headindexcounter++; 
     anfang->next=NULL; 
    }else{ 
     struct SearchEntry *zeiger; 
     zeiger=anfang; 
     while(zeiger->next!=NULL) 
     zeiger=zeiger->next; 
     if((zeiger->next=malloc(sizeof(struct SearchEntry)))==NULL){ 
      fprintf(stderr, "Kein Speicherplatz vorhanden für Anfang\n"); 
      return; 
     } 
     zeiger=zeiger->next; 
     if(TimeStamp!=NULL){ 
      zeiger->TimeStamp=malloc(sizeof(char)*strlen(TimeStamp)); 
      strcpy(zeiger->TimeStamp, TimeStamp); 
     }else{ 
      strcpy(zeiger->TimeStamp, "0"); 
     } 
     if(IP!=NULL){ 
      zeiger->IP=malloc(sizeof(char)*strlen(IP)); 
      strcpy(zeiger->IP, IP); 
     }else{ 
      strcpy(zeiger->IP, "0"); 
     } 
     if(Empfaenger!=NULL){ 
      char *empfaenger=strtok(Empfaenger, ", "); 
      zeiger->anfangE=NULL; 
      zeiger->nextE=NULL; 

      //Here begins the code to put kame a new struct/list inside of the firstlist SearchEntry 

      while(empfaenger!=NULL){ 
       printf("EMPFAENGER: %s\n", empfaenger); 
       if(zeiger->anfangE==NULL){ 
        if((zeiger->anfangE=malloc(sizeof(struct Empfaenger)))==NULL){ 
         fprintf(stderr, "Kein Speicherplatz vorhanden für Anfang\n"); 
         return; 
        } 
        zeiger->anfangE->Empfaenger=malloc(sizeof(char)*strlen(empfaenger)); 
        strcpy(zeiger->anfangE->Empfaenger, empfaenger); 
        printf("zeiger->anfangE->Empfaenger=%s\n", zeiger->anfangE->Empfaenger); 
        zeiger->anfangE->headindex=headindexcounterE; 
        headindexcounterE++; 
        zeiger->anfangE->nextE=NULL; 
        printf("xyz_a!\n"); 
       }else{ 
        printf("abc_b!\n"); 
        struct Empfaenger *zeigerE; 
        zeigerE=zeiger->anfangE; 
        while(zeigerE->nextE!=NULL) 
        zeigerE=zeigerE->nextE; 
        if((zeigerE->nextE=malloc(sizeof(struct Empfaenger)))==NULL){ 
         fprintf(stderr, "Kein Speicherplatz vorhanden für Anfang\n"); 
         return; 
        } 
        zeigerE=zeigerE->nextE; 
        zeigerE->Empfaenger=malloc(sizeof(char)*strlen(empfaenger)); 
        strcpy(zeigerE->Empfaenger, empfaenger); 
        printf("zeiger->anfangE->Empfaenger=%s\n", zeigerE->Empfaenger); 
        zeigerE->headindex=headindexcounterE; 
        headindexcounterE++; 
        zeigerE->nextE=NULL; 
        printf("xyz_b!\n"); 
       } 
       empfaenger=strtok(0, ", "); 
      } 

//

 }else{ 
      printf("NULL: %s\n", Empfaenger); 
      strcpy(zeiger->anfangE->Empfaenger, "NULL"); 
      zeiger->anfangE->headindex=0; 
      zeiger->anfangE->nextE=NULL; 
     } 
     if(MailId!=NULL){ 
      zeiger->MailId=malloc(sizeof(char)*strlen(MailId)); 
      strcpy(zeiger->MailId, MailId); 
      printf("%s\n", zeiger->MailId); 
     }else{ 
      strcpy(zeiger->MailId, "0"); 
     } 
     printf("y!\n"); 
     zeiger->headindex=headindexcounter; 
     headindexcounter++; 
     zeiger->next=NULL; 
     printf("stopb!\n"); 
    } 
} 

這是讀取所有數據的功能出了兩個列表:

void Searchoutput(){ 
    struct SearchEntry *zeiger=anfang; 
    while(zeiger!=NULL){ 
     printf("%s\n", zeiger->TimeStamp); 
     printf("%s\n", zeiger->IP); 
     printf("%s\n", zeiger->MailId); 
     struct Empfaenger *zeigerE=zeiger->anfangE; 
     while(zeigerE!=NULL){ 
      printf("%s\n", zeigerE->Empfaenger); 
      zeigerE=zeigerE->nextE; 
     } 
     zeiger=zeiger->next; 
    } 
} 

放置數據在第一和第二鏈表代碼工作,也當我嘗試讀取數據出來的只有第一,但是當我嘗試讀取數據列全國第一和那麼循環內部也嘗試讀出第二個鏈表的數據,我得到一個內存訪問錯誤。 有誰知道問題在哪裏?我已經嘗試過沒有第二個列表的部分,因爲我知道這是有效的。

+0

嚴重嗎?你甚至可以縮進代碼,也不會聽說SSCCE =你真的相信,有人會讀這個來解決你的問題嗎? – dhein

+0

對不起,但我不知道縮進問題在哪裏,我讓id將程序分爲三部分。我不能把包括main在內的完整程序放在這裏,因爲在這裏它會太大。我真的知道這是我程序中導致錯誤的唯一部分... –

回答

0

您對內存分配的字符串錯誤,您無法爲終結器分配空間。這意味着每個strcpy()都會覆蓋隨機存儲器,這會導致未定義的行爲。

這些:

anfang->TimeStamp=malloc(sizeof(char)*strlen(TimeStamp)); 
anfang->IP=malloc(sizeof(char)*strlen(IP)); 
anfang->MailId=malloc(sizeof(char)*strlen(MailId)); 

應該是:

anfang->TimeStamp = malloc(strlen(TimeStamp) + 1); 
anfang->IP = malloc(strlen(IP) + 1); 
anfang->MailId = malloc(strlen(MailId) + 1); 

我通過sizeof(char)去除無謂的比例,這是始終將是1.你也應該依靠它們之前檢查是否存在故障的撥款成功了。最後,上述效率相當低,因爲它只做了三次小的分配,而不是一次大的分配,但可能需要它們獨立。

+0

是的,我忘了支票,那可能是真的,但是對於一個單一的大單是什麼意思,我甚至沒有聽說過這個...你的意思是我應該爲此採取一個大陣列? –

+0

我現在已經檢查過了,但第一個將TimeStamp,Ip和MailId的數據放在第一個列表中的部分已經可以工作了。發生內存錯誤的問題是第二部分,這裏是第三個灰色框。 –