Example 8-1 shows the use of the malloc, calloc, and free functions.
/* This example takes lines of input from the terminal until * * it encounters a Ctrl/Z, it places the strings into an * * allocated buffer, copies the strings to memory allocated * * for structures, prints the lines back to the screen, and * * then deallocates all memory used for the structures. */ #include <stdlib.h> #include <stdio.h> #define MAX_LINE_LENGTH 80 struct line_rec /* Declare the structure. */ { struct line_rec *next; /* Pointer to next line. */ char *data; /* A line from terminal. */ }; int main (void) { char *buffer; /* Define pointers to * * structure (input lines). */ struct line_rec *first_line = NULL, *next_line, *last_line = NULL; /* Buffer points to memory. */ buffer = malloc(MAX_LINE_LENGTH); if (buffer == NULL) /* If error ... */ { perror("malloc"); exit(EXIT_FAILURE); } while (gets(buffer) != NULL) /* While not Ctrl/Z ... */ { /* Allocate for input line. */ next_line = calloc(1, sizeof (struct line_rec)); if (next_line == NULL) { perror("calloc"); exit(EXIT_FAILURE); }
/* Put line in data area. */ next_line-> data = buffer; if (last_line == NULL) /* Reset pointers. */ first_line = next_line; else last_line-> next = next_line; last_line = next_line; /* Allocate space for the * * next input line. */ buffer = malloc(MAX_LINE_LENGTH); if (buffer == NULL) { perror("malloc"); exit(EXIT_FAILURE); } } free(buffer); /* Last buffer always unused. */ next_line = first_line; /* Pointer to beginning. */ while (next_line != NULL); { puts(next_line -> data); /* Write line to screen. */ free(next_line -> data); /* Deallocate a line. */ last_line = next_line; next_line = next_line-> next; free(last_line); } exit(EXIT_SUCCESS); }
The sample input and output for Example 8-1 are as follows:
$ RUN EXAMPLE line one line two <Ctrl/Z> EXIT line one line two $