Salve, ho scritto questo codice in C, e non riesco a capire perchč una volta eseguito il processo mi dice "Segmentation fault", qualcuno sā dirmi dove sbaglio?

Il risultato in teoria dovrebbe essere 30, ma non capisco esattamente dove stia l'errore, (credo nel pop).

Grazie

codice:
#include <stdio.h>
#include <stdlib.h>
 
struct dato {
   int elemento;
   struct dato * punt;
};

void create (struct dato *);
void push (struct dato *, int);
void pop (struct dato *, int *);

int main () {
   int a;
   struct dato * s1;

   create (s1);

   push (s1, 10);
   push (s1, 20);
   push (s1, 30);

   pop (s1, &a);
   printf ("%d \n", a);

   return (0);
}

void create (struct dato * s) {
   s = NULL;
}

void push (struct dato * s, int d) {
   struct dato * p = (struct dato *) malloc (sizeof (struct dato));
   p -> elemento = d;
   p -> punt = s;
   s = p;
}

void pop (struct dato * s, int * d) {
   struct dato * p = s;
   * d = s -> elemento;
   s = s -> punt;
   free (p);
}