C free (): puntero no válido asignado en otra función

Soy nuevo en StackOverflow. Estoy aprendiendo el puntero C ahora.

Este es mi código:

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

int alloc(int* p){
    p = (int*) malloc (sizeof(int));
    if(!p){
        puts("fail\n");
        return 0;
    }
    *p = 4;
    printf("%d\n",*p);
    return 1;
}

int main(){

    int* pointer;

    if(!alloc(pointer)){
        return -1;
    }else{

        printf("%d\n",*pointer);
    }

    free(pointer);

    return 0;
}

Compilo con: gcc -o main main.c

error: libre (): puntero no válido: 0xb77ac000 ***

¿Qué tiene de malo mi código?

Respuestas a la pregunta(5)

Su respuesta a la pregunta