Se dichiari un puntatore a una struttura, prima di accedere ai campi devi allocare la memoria per la strutttura: la dichiarazione del puntatore dichiara il puntatore che puntera ad una zona arbitraria della memoria e se tenti di accedervi quasi probabilmente avrai l'errore di segmentation fault. Devi quindi allocare la memoria con malloc a cuui passi la dimensione del tipo di dato da allorcare che ottieni con l'operatore sizeof applicato al tipo: sizeof(struct tm):
Quindi sostituisci le righe:
struct tm * start;
struct tm * end;
con:
struct tm * start = ((struct tm))malloc(sizeof(struct tm));
struct tm * end = ((struct tm))malloc(sizeof(struct tm));