2010-01-19 22 views
20

¿Esto ...¿Estas afirmaciones sobre los indicadores tienen el mismo efecto?

char* myString = "hello"; 

... tiene el mismo efecto que esto?

char actualString[] = "hello"; 
char* myString = actualString; 
+2

Parece que tiene un código que se puede compilar y probar fácilmente ... ¿por qué no lo prueba? –

+0

Esto se ha preguntado un montón! ~ – JonH

+16

Él no está preguntando si funciona o compila. Él pregunta si ambas declaraciones tienen el mismo efecto (también conocido como trabajo de la misma manera). A lo que la respuesta es no. –

Respuesta

33

char str1[] = "Hello world!"; //char-array on the stack; string can be changed 
char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY 

El primer ejemplo crea una matriz de tamaño 13*sizeof(char) en la pila y copia la cadena "Hello world!" en ella.
El segundo ejemplo crea un char* en la pila y lo dirige a una ubicación en el segmento de datos del ejecutable, que contiene la cadena "Hello world!". Esta segunda cadena es READ-ONLY.

str1[1] = 'u'; //Valid 
str2[1] = 'u'; //Invalid - MAY crash program! 
+1

Supongo que quería decir 'char str1 []' en lugar de 'char [] str1'. –

+2

esta es la razón por la que algunos compiladores lo advierten, a menos que escriba 'const char * blah =" blahblah "' – gnud

+0

[Esta respuesta] (http://stackoverflow.com/questions/349025/is-a-string-literal-in- c-created-in-static-memory/349030 # 349030) explica el razonamiento detrás de esto. – Lazer

3

No. En el primero de ellos, no se puede modificar la cadena apuntada por myString, en el segundo se puede. Leer más here.

4

No. El primero le da un puntero a const de datos, y si cambia cualquier carácter a través de ese puntero, que es un comportamiento indefinido. El segundo copia los caracteres en una matriz, que no es const, por lo que puede cambiar cualquier carácter (ya sea directamente en matriz o mediante un puntero) a voluntad sin efectos nocivos.

3

No es lo mismo, porque la matriz sin nombre apuntada por myString en el primer ejemplo es de solo lectura y tiene una duración de almacenamiento estático, mientras que la matriz nombrada en el segundo ejemplo es grabable y tiene una duración de almacenamiento automática.

Por otro lado, este es más cerca a ser equivalente:

static const char actualString[] = "hello"; 
char* myString = (char *)actualString; 

Es todavía no es lo mismo, sin embargo, debido a que las matrices anónimas creadas por los literales de cadena no se garantiza que sea único, mientras que explícita matrices son. Así, en el siguiente ejemplo:

static const char string_a[] = "hello"; 
static const char string_b[] = "hello"; 
const char *ptr_a = string_a; 
const char *ptr_b = string_b; 
const char *ptr_c = "hello"; 
const char *ptr_d = "hello"; 

ptr_a y ptr_b están garantizados para comparar la desigualdad, mientras que ptr_c y ptr_d puede ser o bien iguales o desiguales - ambos son válidos.

Cuestiones relacionadas