C中链接列表中的链表,第二个列表中读取时段错误

时间:2013-11-22 12:13:58

标签: c pointers struct linked-list singly-linked-list

我正在为一个邮件服务器的日志文件searchprogramm写。我有eine struct,里面有另一个结构。我的func将TimeStamp的数据,一个MailserverIp,特定的MailId放在一个单链表中。此外,我有一个接收器列表,我也想把它放在一个链表中,它是第一个单链表中的指针。 (链表中的链表)

我所做的结构如下:

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;
    }
}

代码将数据放在第一个和第二个链表中,并且当我尝试从第一个链接列表中读取数据时,但是当我尝试从第一个和第二个内部读取数据时循环还尝试读出第二个链表的数据我得到了内存访问错误。 有谁知道问题在哪里?我已经尝试过没有第二个列表的部分了,因为我知道它有效。

1 个答案:

答案 0 :(得分: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.你还应该在依赖它们成功之前检查失败的分配。最后,上面的效率非常低,因为它做了三个小的分配,而不是一个大的分配,但也许你需要它们是独立的。