2011-01-13 20 views
31

¿Cuál es la diferencia entre estos dos en términos de asignación de memoria.Asignación de memoria char * y char []

char *p1 = "hello"; 
char p2[] = "hello"; 
+13

¡El primero debe ser 'const char *'! – rubenvb

+0

'p1' toma 4 u 8 bytes (requerido para almacenar una dirección de memoria) que depende de la plataforma. 'p2' toma 6 bytes (= 5 bytes para la cadena' hello' + 1 byte para el carácter de terminación nulo). – RBT

Respuesta

35

El primero crea un variables puntero (cuatro u ocho bytes de almacenamiento dependiendo de la plataforma) y almacena una ubicación de una cadena literal allí, El segundo crea una matriz de seis caracteres (incluyendo cero byte terminador de cadena) y copia el literal allí.

Debería obtener una advertencia de compilación en la primera línea ya que el literal es const.

+0

¿Dónde exactamente se almacena la cadena literal? ¿Está en montón? – blitzkriegz

+10

El literal de cadena se almacena comúnmente en una región de memoria separada tanto de la pila como del montón ('nuevo' /' eliminado'-administrado). Dependiendo de su plataforma, esta región puede estar protegida contra copia, por lo que escribir en ella bloqueará el programa. –

+0

Muchas gracias por la respuesta clara como el cristal. – blitzkriegz

8

El primero es un puntero no const para const (solo lectura) de datos, el segundo es una matriz no const.

+0

Entonces, ¿es char * p1 = "hello" equivalente a char const * p1 = "hello"? – blitzkriegz

+3

@Mahatma: sí, y esto también es lo mismo que la versión más legible e intuitiva: 'const char * p1 =" hello "'. –

+2

@Mahatma: sí, pero el primero es peligroso: sin una calificación 'const', no hay protección del compilador contra el intento de modificar el literal de la cadena, dando un comportamiento indefinido. –

6

Desde el primero es un puntero no constante a const de datos (sólo lectura), la segunda es una matriz no constante, como dijo Pablo, se puede escribir:

p2[2]='A'; //changing third character - okay 

Pero no se puede escribe:

p1[2]='A';//changing third character - runtime error! 
+1

El segundo caso es en realidad peor que un error de compilación; lo más probable es que el compilador lo acepte, lo que le da un comportamiento de tiempo de ejecución no definido. –

+1

Eso no es cierto, no obtendrá un error de compilación ya que el literal de cadena no es const. Sin embargo, obtendrá UB. – Puppy

+0

@DeadMG: corregido. :-) – Nawaz