Implementing a dynamic list with malloc

#include <stdio.h>
struct node {
    int i;
    struct node *next;
};
int main(void) {
 struct node* temp, *list = NULL;
 for(i=0;i<10;i++) {
  temp = (struct node *) malloc(sizeof(struct list));
  temp->i = i;
  temp->next = list;
  list = temp;
 }
  // do something with list and free nodes later
  return 0;
}

This is extremely common code in C programs. Freeing the list is easy because all nodes are hanging together via the next pointer.