Hola, primero el
* define un puntero en C++, para saber más de ello
aquí. En esencia un puntero guarda la dirección de memoria de una variable que es de un tipo de dato (para su implementación es de tipo
char).
Hay un error en su código, la variable
nombre tiene una dirección de memoria fija y este va cambiando de valor mientras
c='s', lo malo está en que si nombre="abc", entonces nombres[0]="abc" en la primera iteración, luego si cambia a nombre="cde" y hace que nombres[1]=nombre, esto hará que nombres[0]="cde", puesto que nombres[0] y nombres[1] apuntan a la misma dirección de memoria.
El error que le tira es por falta de memoria en su vector de cadenas;