¿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;
¿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;
Nº
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!
Supongo que quería decir 'char str1 []' en lugar de 'char [] str1'. –
esta es la razón por la que algunos compiladores lo advierten, a menos que escriba 'const char * blah =" blahblah "' – gnud
[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
No. En el primero de ellos, no se puede modificar la cadena apuntada por myString
, en el segundo se puede. Leer más here.
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.
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.
Parece que tiene un código que se puede compilar y probar fácilmente ... ¿por qué no lo prueba? –
Esto se ha preguntado un montón! ~ – JonH
É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. –