El acceso dinámico a la memoria solo funciona dentro de la función

Esta pregunta está destinada a ser utilizada como un duplicado canónico para estas preguntas frecuentes:

Estoy asignando datos dinámicamente dentro de una función y todo funciona bien, pero solo dentro de la función donde tiene lugar la asignación. Cuando intento usar los mismos datos fuera de la función, me cuelgo u otro comportamiento inesperado del programa.

Aquí hay unMCVE:

#include <stdlib.h>
#include <stdio.h>

void create_array (int* data, int size)
{
  data = malloc(sizeof(*data) * size);
  for(int i=0; i<size; i++)
  {
    data[i] = i;
  }

  print_array(data, size);
}

void print_array (int* data, int size)
{
  for(int i=0; i<size; i++)
  {
    printf("%d ", data[i]);
  }
  printf("\n");
}

int main (void)
{
  int* data;
  const int size = 5;

  create_array(data, size);
  print_array(data, size);  // crash here

  free(data);
}

Cuandoprint_array se llama desde adentrocreate_array función, obtengo el resultado esperado0 1 2 3 4, pero cuando lo llamo desdemain, Me cuelga un programa.

¿Cuál es la razón para esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta