The malloc and free of arrays, in various ways.
Code:
#include <stdio.h>
#include <stdlib.h>

void f1(void) {
  int a[10];
  int *b = malloc(10*sizeof(*b));
  ///
  free(b);
}

// If the minor dimension is always fixed
void f2(void) {
  int a[10][20];
  int (*b)[20] = malloc(10*sizeof(*b));
  ///
  free(b);
}

// variable in both dimensions
void f3(void) {
  int a[10][20];
  int **b = malloc(10*sizeof(*b));
  for( int i = 0 ; i < 10 ; i++ )
    b[i] = malloc(20*sizeof(*b[i]));
  ///
  for ( int i = 0 ; i < 10 ; i++ )
    free(b[i]);
  free(b);
}

// variable in both dimensions, but all rows the same
void f4(void) {
  int a[10][20];
  int **b = malloc(10*sizeof(*b));
  b[0] = malloc(10*20*sizeof(*b[0]));
  for( int i = 1 ; i < 10 ; i++ )
    b[i] = b[i-1] + 20;
  ///
  free(b[0]);
  free(b);
}

int main ( ) {
  f1();
  f2();
  f3();
  f4();
}