C-插入/打印上的链接列表segfault



我有一个链接列表,带有struct/insert/print函数如下,

typedef struct node{
    int size;
    int day;
    int year;
    char* month;
    char* fileName;
    struct node *next;
}node;
void insert(node ** head, int size, int year, int day, char* month, char* fileName){
    node * newNode = (node*)malloc(sizeof(node));
    newNode->size = size;
    newNode->fileName = fileName;
    newNode->day = day;
    newNode->month = month;
    newNode->year = year;
    newNode->next = *head;
    *head = newNode;
    puts("insert called");
    //printf("head is %sn", newNode->fileName);
}
void print_list(node * head) {
    node * current = head;
    while (current != NULL){
        puts("got here");
        printf("head %sn", current->fileName);
        current = current->next;
        printf("next filename %sn", current->fileName);
    }
}

当我调用插入函数时,它将在我称之为该函数的次数中打印"插入"消息的"插入"消息。所以我的猜测是插入功能不是问题。

我的问题是我在打印功能打印列表中的前几个节点之后得到了一个segfault(对于前两个节点来说很好!)

这是调用插入函数的代码的其余部分,我认为这不是她的问题,但我可能会误会:

链接列表功能的所有调用均为底部

void p5aFlag(char* pathName){
    DIR* d;
    struct dirent *dir;
    struct stat s;
    struct tm *tp;
    char* fileName;
    char temp2[strlen(pathName)];
    char * month;
    time_t t;
    d = opendir(pathName);
    int year;
    int day;
    int size;
    node *head = NULL;
    int flag = 0;
    if(d){   //While there are more files in the directory, keep reading them off
        while ((dir = readdir(d)) != NULL){
            fileName = dir->d_name; //store the name of the directory that was just read in fileName
            strcpy(temp2,pathName); // copy the directory name into temp2
            if(strcmp(fileName, ".") != 0 && strcmp(fileName, "..") != 0){ // get file info if the file isn't "." or ".."
                strncat(temp2,"/",2); // prepare the path to lead to another file
                strncat(temp2, fileName, 15); // append the fileName to the path, now we can open this file
                if(stat(temp2, &s) == -1 ){ // if we cannot get information for this file, print error message and exit
                    fprintf(stderr, "couldnt get file info for %sn", fileName);
                }
                t = s.st_mtime; //store the time that the file was last modified in t
                tp = localtime(&t); // convert to local time
                switch(tp->tm_mon){  // switch to change months from [0-11] to [Jan-Dec]
                    case 0:
                    month = "Jan";
                    break;
                    case 1:
                    month = "Feb";
                    break;
                    case 2:
                    month = "Mar";
                    break;
                    case 3:
                    month = "Apr";
                    break;
                    case 4:
                    month = "May";
                    break;
                    case 5:
                    month = "Jun";
                    break;
                    case 6:
                    month = "Jul";
                    break;
                    case 7:
                    month = "Aug";
                    break;
                    case 8:
                    month = "Sep";
                    break;
                    case 9:
                    month = "Oct";
                    break;
                    case 10:
                    month = "Nov";
                    break;
                    case 11:
                    month = "Dec";
                    break;
                    default:
                    break;
                }
                flag = 1;
            }
            if(flag == 1){
                year = 1900 + tp->tm_year;
                size = s.st_size;
                day = tp->tm_mday;
                insert(&head, size, year, day, month, fileName);
                flag = 0;
            }
            temp2[0]= '';
            flag = 0;
        }
        //search(head, ".emacs");
        print_list(head);
        closedir(d); // close the directory
    }
}

我不确定为什么会发生这种情况。任何帮助将不胜感激。

打印最后一个元素时,您将获得一个segfault,因为您将当前设置为Current->下一个,但在打印下一个文件名之前,请勿检查它是否是NULL

void print_list(node * head) {
    node * current = head;
    while (current != NULL){
        puts("got here");
        printf("head %sn", current->fileName);
        current = current->next;
        if(current != NULL)   /// add this check
            printf("next filename %sn", current->fileName);
    }
}

您在这里也有毫无意义的分配和内存泄漏:

node *head = (struct node *) malloc( sizeof(node));
head = NULL;

您分配一个节点,然后通过将头设置为NULL来失去对其的任何引用。您可以像这样初始化到NULL

node *head = NULL;

最新更新