我正在寫郵件服務器的日誌文件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;
}
}
放置數據在第一和第二鏈表代碼工作,也當我嘗試讀取數據出來的只有第一,但是當我嘗試讀取數據列全國第一和那麼循環內部也嘗試讀出第二個鏈表的數據,我得到一個內存訪問錯誤。 有誰知道問題在哪裏?我已經嘗試過沒有第二個列表的部分,因爲我知道這是有效的。
嚴重嗎?你甚至可以縮進代碼,也不會聽說SSCCE =你真的相信,有人會讀這個來解決你的問題嗎? – dhein
對不起,但我不知道縮進問題在哪裏,我讓id將程序分爲三部分。我不能把包括main在內的完整程序放在這裏,因爲在這裏它會太大。我真的知道這是我程序中導致錯誤的唯一部分... –