I run the code from Listing 17.2, P781, C Primer Plus 6th Edition.
/* films2.c -- using a linked list of structures */
#include <stdio.h>
#include <stdlib.h> /* has the malloc prototype */
#include <string.h> /* has the strcpy prototype */
#define TSIZE 45 /* size of array to hold title */
struct film {
char title[TSIZE];
int rating;
struct film *next; /* points to next struct in list */
};
char *s_gets(char *st, int n);
int main(void)
{
struct film *head = NULL;
struct film *prev, *current;
char input[TSIZE];
/* Gather and store information */
puts("Enter first movie title:");
while (s_gets(input, TSIZE) != NULL && input[0] != '\0') {
current = (struct film *) malloc(sizeof(struct film));
if (head == NULL) /* first structure */
head = current;
else /* subseqent structures */
prev->next = current;
current->next = NULL;
strcpy(current->title, input);
puts("Enter your rating <0-10>:");
scanf("%d", ¤t->rating);
while (getchar() != '\n')
continue;
puts("Enter next movie title (empty line to stop):");
prev = current;
}
/* show list of movies */
if (head == NULL)
printf("No data entered.");
else
printf("Here is the movie list:\n");
current = head;
while (current != NULL) {
printf("Movie: %s Rating: %d\n",
current->title, current->rating);
current = current->next;
}
/* Program done, so free allocated memory */
current = head;
while (current != NULL) {
free(current);
printf("Movie: %s, Rating: %d\n",
current->title, current->rating);
current = current->next;
}
printf("Bye!\n");
return 0;
}
char *s_gets(char *st, int n)
{
char *ret_val;
char *find;
ret_val = fgets(st, n, stdin);
if (ret_val) {
find = strchr(st, '\n'); // look for newline
if (find) // if the address is not NULL,
*find = '\0'; // place a null character there
else
while (getchar() != '\n')
continue; // dispose of rest of line
}
return ret_val;
}
My question is that after free(current)
, current->title
and current->rating
still is there, and current->next
is not NULL
. I don't know why.
The variable is still available for use but the space allocated isn't so you will have undefined behavior. It can work now but it can crash later. A good practice is to set your pointer to NULL after freeing it.