esp y ing si son char.
mmmmm yo pense que necesariamente tenian que tener direcciones de memoria diferentes y q eso ya se asignaba automaticamente
Son char *, punteros a char, y no se asigna automaticamente nada. Ambas variable en x86 ocupan 4 BYTES unicamente y lo que hacen es tener como valor una direccion de memoria en esta caso la donde esta/ba la cadena que hayas obtenido por teclado y que sera la direccion devuelta por new. Si te das cuenta esa direccion seguramente es repetida todas las veces que entra a esa funcion ya que como haces delete se recicla.
Para que se haga "automaticamente" podes usar string en vez de char * en la estructura. Y despues no instanciar una variable de la estructura sino dos variable char *.
Algo asi (es para que te guies):
char *esp = new char[50];
char *ing = new char[50];
printf("\nIngrese la palabra en espanol: ");
gets(esp);
printf("Ingrese la palabra en ingles: ");
gets(ing);
//primero usamos 0 como indice
Diccionario[*cont].esp = esp;
Diccionario[*cont].ing = ing;
(*cont)++;
delete [] esp;
delete [] ing;
Y para cuando quieras imprimir los resultados usa esp.c_str(); que te devuelve el char * necesario.