No te líes, lo que tienes está bien.
Si quieres el número exacto de registros, pones un puntero a registros, y le reservas la memoria que necesites.
Lo mismo para cada cadena de caracteres dinámica que tengas en los registros, pones un puntero a char (como ya tienes) y le reservas la memoria que quieras (y luego le copias la cadena que quieras).
Únicamente te recuerdo el carácter '\0' de fín de cadena, para el que deberías reservar memoria también en la cadena de caracteres del registro oportuno.
Resumiendo:
registros * bdd;
Para reservar 3 registros:
bdd = (registros ) malloc (sizeof(registros)3);
Para escribir una cadena en el segundo registro desde la cadena 'fuente':
bdd[1]->cadena = (char)malloc(sizeof(char)(strlen(fuente)+1));
strcpy(bdd[1]->cadena, fuente);
Si necesitas algo más...
PD: lo de #4 es una lista enlazada, y si no sabes exáctamente lo que es, mejor no te pongas a programarla. Es útil, pero más compleja de manejar y requiere un poco de soltura con punteros.