Punteros y memoria asignada con new.

Punteros y memoria asignada con new.

de Esteban Normey Rieta -
Número de respuestas: 0

Buenas,
Estoy tanteando cosas en C para familiarizarme con el lenguaje.
Viendo como funcionan los punteros y "new", empecé a probarlos para strings.
Mi duda es, ¿cómo se debe asignar strings a punteros? y
¿cuándo nos interesa pedir memoria para strings/arreglos de carácteres?
Estas dudas surgen porque:

Supongamos que tengo:

char *frase = new char[5];

Si intento:

*frase = "Hola.";

No me deja, pues realmente el contenido de "*frase" es un caracter en sí (el primero).

Si hago:

frase = "Hola.";

Lo que creo que hace es: desrefencia el arreglo de 5 caracteres pedido al principio y referencia el string "Hola." en otro lado. Entonces, la memoria que pedía al principio fue innecesaria.

Es más, llegué a esta conclusion por dos cosas:
1)."frase" es un puntero a un arreglo de caracteres y tengo entendido que el string "Hola." tambien es un puntero al arreglo de caracteres ['H','o','l','a','.']. Entonces lo que realmente hago en la asignacion es apuntar a otro lado de memoria, no asignarle a la memoria pedida. (si p1 y p2 son punteros, cuando se hace "p1=p2" lo que realmente se asigna es la ubicacion de memoria, no?

2). Realmente empecé a sospechar esto cuando pude asignar por ejemplo:

    frase = "Muchas cosas";

lo cual claramente excede el espacio pedido al principio. Y doy fe de que realmente queda todo el arreglo guardado en frase puesto que luego lo podia imprimir completo.

Y lo comprobé imprimiendo la direccion de memoria antes de la asignacion y luego de la asignacion (son diferentes).

Además, observé que con "scanf("%s",frase)" no cambia la ubicacion de memoria a la que apunta "frase", pero cuando le das un input más grande del que pediste espacio, lo guarda todo igual.  Si van a "principal" del practico 0 y en "esPalindrome" exceden el numero de carácteres, la función toma en cuenta los caracteres excedentes igualmente.