Con questa

b = (char*)calloc(d, sizeof(char));

dato che d è 0, non creerai altro che un problema di accesso in memoria.

Per un array di stringhe, prevedi un "puntatore doppio a char" e alloca un numero di "puntatori a char" pari al numero di stringhe da memorizzare.

Poi, utilizza una stringa allocata con una dimensione abbastanza grande per l'input e infine, alloca lo spazio per questa stringa con uno dei puntatori dell'array precedente e copiaci la stringa.

Più facile a farsi che a dirsi.