我有一个带有结构和插入/打印功能的链表,如下所示,
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
}
}
我不确定为什么会这样。任何帮助将不胜感激。
答案 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;