插入/打印时链接列表段错误

时间:2015-05-08 23:56:20

标签: c struct linked-list

我有一个带有结构和插入/打印功能的链表,如下所示,

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 %s\n", newNode->fileName);
}
void print_list(node * head) {
    node * current = head;
    while (current != NULL){
        puts("got here");
        printf("head %s\n", current->fileName);
        current = current->next;
        printf("next filename %s\n", current->fileName);
    }
}

当我调用insert函数时,它会按照我调用该函数的次数打印“insert called”消息。所以我的猜测是插入功能不是问题。

我的问题是,在print函数打印列表中的前几个节点后,我得到了一个Segfault(它适用于前两个节点!)

以下是调用insert函数的其余代码, 我不认为这是她的问题,但我可能会弄错:

链接列表功能的所有调用都在底部

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 %s\n", 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]= '\0';
            flag = 0;
        }
        //search(head, ".emacs");
        print_list(head);
        closedir(d); // close the directory
    }
}

我不确定为什么会这样。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

打印最后一个元素时会出现段错误,因为您将当前设置为当前 - >接下来但是在打印下一个文件名之前不要检查它是否为NULL

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

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

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

您可以通过将头设置为NULL来分配节点,但会丢失对它的任何引用。您可以像这样初始化为NULL

node *head = NULL;