I'm experiencing a problem with a C program. I am allocating two nodes dynamically and creating a linked list. The problem is when I return from the function, it gives me a segmentation fault. My code looks fine, and it runs fine under digital unix. Do I have to do something different with linux when using dynamic memory? I've attached my code if someone would look at it. Thanks for the help.
#include <stdio.h> #include <stdlib.h> struct linked_list { char name[50]; struct linked_list *next; }; typedef struct linked_list ELEMENT; typedef ELEMENT *link; /* Function prototypes */ link read_file(void); /*-----------------------------------------------------------*/ int main(void) { link h; printf("\n%s\n", "hello1"); h = read_file(); printf("\n\n%s\n\n", "back"); printf("\%s\n", h->name); printf("\n%s\n", "hello"); return 0; } link read_file(void) { char filename; FILE *ifp; link extraptr = NULL; link headptr = NULL; printf("%s", "Enter file name: "); scanf("%s", &filename); ifp = fopen(&filename, "r"); /* open file */ if (ifp == NULL) /* check if file exists */ { printf("\n%s%s%s\n", "Error, the file \"", &filename, "\" does not exist or cannot be accessed."); exit(1); } else printf("\n%s%s%s\n\n", "Attempting to open \"", &filename, "\" ..."); headptr = malloc(sizeof(ELEMENT)); /* create head node */ fscanf(ifp, "%s", headptr->name); /* read first name into array */ headptr->next = NULL; /* mark link to next node as null */ extraptr = headptr; /* while ((extraptr->name) != "") */ { extraptr->next = malloc(sizeof(ELEMENT)); extraptr = extraptr->next; fscanf(ifp, "%s", extraptr->name); extraptr->next = NULL; } fclose(ifp); /* close file */ printf("%s", "done reading..."); printf("\n%s\n\n", "hello"); return headptr; }