En el primer caso, "string"
se puede almacenar en un área de solo lectura del proceso, por lo que intentar modificar la memoria apuntada por p
podría causar un comportamiento indefinido.
En el segundo caso, la memoria real se asigna e inicializa en la pila en tiempo de ejecución (o en una sección apropiada del proceso al inicio del programa si no es una variable local), por lo que la modificación es correcta.
El primer caso se puede ilustrar como esto:
+---+ +---+---+---+---+---+---+---+
| | ----> | s | t | r | i | n | g | \0|
+---+ +---+---+---+---+---+---+---+
p
Considerando que el segundo caso es:
+---+---+---+---+---+---+---+
| s | t | r | i | n | g | \0|
+---+---+---+---+---+---+---+
p
Las dos declaraciones tienen una diferencia significativa, aunque es posible que haya oído hablar de que son el mismo de los libros de programación de baja calidad C.
El primero es un puntero de tipo char *
, mientras que el segundo es un array de tipo char []
. Los identificadores de matriz se descomponen en un puntero en algunos contextos, pero eso no los convierte en punteros.
Un puntero es meramente una dirección y una matriz es "toda la cosa" - en el primer caso sizeof(p)
produce el tamaño de un puntero (por lo general 4
o 8
dependiendo de la máquina de destino), y en el segundo caso se produce 7 * sizeof(char)
, la longitud de la cadena real.
Le recomendamos leer la sección 6 (y otras) de [la c-faq] (http://c-faq.com/). – pmg
encontró algo interesante: http://www.geeksforgeeks.org/storage-for-strings-in-c/ – NDestiny