我有一个链接列表,带有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;