Post by Sergio Fernandezyo reservaria memoria dinamica para almacenar la cadena en p, ya que si no,
te puede dar problemas de memoria.
imagino que esto sera un ejemplo de lo que haces y que en realidad utilizas
para algo mas la cadena, asi que yo te recomendaria hacer la reserva de
memoria.
si lo haces asi, no te olvides luego del free, que hay que liberarla una vez
no se utilice.
void main()
{
char *p;
p= (char *) malloc (strlen("Esto es una prueba") * sizeof (char));
p="Esto es una prueba";
free (p);
}
Tienes un pequeño error en este código. En realidad, con este código,
estás reservando 3 veces más espacio del que necesitas. Es más, el
espacio reservado lo desaprovechas.
Como he mencionado antes, el compilador* ya reserva espacio para las
constantes de tu código. Así, este, reservará espacio para la primera
cadena de "Esto es una prueba" incluida en el strlen y la segunda cadena
en la asignación de p. Después, en tiempo de ejecución, se reserva un
espacio con la longitud de strlen("Esto es una prueba")*sizeof(char).
Espacio que desaprovechas porque para introducir es frase en ese espacio
tendrías que haber hecho lo siguiente:
strcpy(p,"Esto es una prueba");
en vez de
p="Esto es una prueba";
Además de que te olvidas del caracter nulo que hay al final de toda
cadena en C.
Voy a poner un ejemplo:
Cuando compilas el compilador reservará el espacio de las dos frases en
estas direcciones de ejemplo:
PosMem Value Tamaño
1000 Esto es una prueba(nulo) 19 (suponiendo que sizeof(char) = 1
1019 Esto es una prueba(nulo) 19 (idem arriba)
y para la variable p
PosMem Value Tamaño
1038 (basura) 4 (suponiendo q sizeof(char*) = 4
Post by Sergio Fernandezp= (char *) malloc (strlen("Esto es una prueba") * sizeof (char));
la memoria queda:
PosMem Value Tamaño
20000 (basura) 19
Y el valor de p sería:
PosMem Value Tamaño
1038 20000 4
Después, cuando haces la otra asignación de p quedaría:
PosMem Value Tamaño
1038 1019 4
Si en vez de todo ese código hicieras:
char *p = "Esto es una prueba"
El resultado sería el mismo y la memoria quedaría:
PosMem Value Tamaño
1000 Esto es una prueba(nulo) 19
1019 1000 4 (posición reservada para p)
*Nota: Cuando digo que el compilador reserva tanto espacio para esta
variable o esta constante, me refiero a que prepara al programa para que
cuando éste se cargue en memoria deje el espacio (ahora mismo no me
acuerdo si lo reserva en el montículo o en el segmento del programa). Es
diferente al método utilizado por malloc que reserva sí y sólo sí la
ejecución ejecuta la instrucción malloc (o su equivante en código
máquina :P)