Se provi a leggere quella discussione che ti ho linkato, forse riesci a capirlo da solo. E' un problema di indirizzi... in pratica tu vai a modificare ogni volta la stringa contenuta all'indirizzo di memoria di "swap" con la lettura da tastiera, e poiché questo indirizzo è lo stesso che assegni ad ogni "stringa[k]" alla fine si ritroveranno tutte a puntare alla stessa area di memoria con la stessa stringa (stringa che è l'ultima che hai scritto, perché è l'ultima modifica di quell'area di memoria che hai fatto). Con una copia invece il discorso cambia... ogni "stringa[k]" ha come valore un indirizzo ad una certa area di memoria allocata e nella quale tu vai a copiare il valore di "swap" letto ad ogni iterazione.

In realtà, comunque, per come era fatto il programma nella sua prima versione non c'era nemmeno bisogno di allocare spazio per ogni singola "stringa[k]", bastava allocare spazio per "cont" puntatori...