2015-05-08 151 views
1

我有一个结构链表,插入/打印功能如下,链表段错误/打印

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

当我打电话插入功能,它打印“插入所谓的”消息作为预期我调用该函数的次数。所以我的猜测是插入功能不是问题。

我的问题是,我得到一个段错误的打印功能打印前几个节点列表后(它工作正常的前两个节点!)

这里是代码的其余部分,其中插入功能被调用时, 我不认为这是她的一个问题,但我可能是错误:

所有调用链表功能是向底部

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

打印的最后一个元素时,您将获得一个段错误,因为你设置的电流到当前>旁边,但不检查它是否是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; 
+1

和一般(没有施展的malloc)注:'节点*头=的malloc(*的sizeof头);'就足够了。 (尽管设置为NULL的问题)@samgak,这不是针对你,只是一个阅读的将军。好答案。 –

+0

感谢您的输入,但是我已经做出了更改,现在我只是在打印头后出现总线错误。 –

+1

这不会只是通过检查NULL指针而引起的,这是您的代码中的一个单独问题。你应该做的一件事是将文件名字符串的副本存储在节点中,而不是使用从readdir返回的指针,该指针指向每次调用readdir时都会被覆盖的字符串。 – samgak