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
}
}
我不知道为什么发生这种情况。任何帮助将不胜感激。
和一般(没有施展的malloc)注:'节点*头=的malloc(*的sizeof头);'就足够了。 (尽管设置为NULL的问题)@samgak,这不是针对你,只是一个阅读的将军。好答案。 –
感谢您的输入,但是我已经做出了更改,现在我只是在打印头后出现总线错误。 –
这不会只是通过检查NULL指针而引起的,这是您的代码中的一个单独问题。你应该做的一件事是将文件名字符串的副本存储在节点中,而不是使用从readdir返回的指针,该指针指向每次调用readdir时都会被覆盖的字符串。 – samgak