Haz esto…
char* myString = "hello";
… tiene el mismo efecto que esto?
char actualString[] = "hello";
char* myString = actualString;
Haz esto…
char* myString = "hello";
… tiene el mismo efecto que esto?
char actualString[] = "hello";
char* myString = actualString;
BlueRaja – Danny Pflughoeft
No.
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 ello.
El segundo ejemplo crea un char*
en la pila y lo apunta a una ubicación en el segmento de datos del ejecutable, que contiene la cadena "Hello world!"
. Esta segunda cadena es SOLO LECTURA.
str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
asumo que te referías char str1[]
en lugar de char[] str1
.
– Alok Singhal
20 de enero de 2010 a las 3:08
es por eso que algunos compiladores te advierten, a menos que escribas const char* blah="blahblah"
– gnud
20 de enero de 2010 a las 12:21
Esta respuesta explica el razonamiento detrás de esto.
– Lazer
26 de septiembre de 2010 a las 18:09
También es por eso que, en C++, inicializar un char*
apuntar a un literal de cadena está en desuso a favor de requerir que el puntero sea char const*
. No es estrictamente relevante para esta pregunta C, entiendo; sin embargo, demuestra los hechos del escenario.
– Carreras de ligereza en órbita
6 de abril de 2011 a las 22:12
Vale la pena mencionar que: en el primer ejemplo, el puntero str1 no se puede cambiar. Es decir, no puedo hacer str1 = some_other_pointer. En el segundo ejemplo, puedo hacer str2 = some_other_pointer.
– rajya vardhan
15 de abril de 2011 a las 13:25
No. El primero le da un puntero a const
data, y si cambia cualquier carácter a través de ese puntero, 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 la matriz o mediante un puntero) a voluntad sin efectos negativos.
Eli Bendersky
No. En el primero, no puedes modificar la cadena apuntada por myString
, en el segundo se puede. Leer más aquí.
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ática, mientras que la matriz nombrada en el segundo ejemplo se puede escribir y tiene una duración de almacenamiento automático.
Por otro lado, esto es más cerca a ser equivalente:
static const char actualString[] = "hello";
char* myString = (char *)actualString;
Sin embargo, todavía no es lo mismo, porque no se garantiza que las matrices sin nombre creadas por los literales de cadena sean únicas, mientras que las matrices explícitas sí lo son. Entonces 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 desigual, mientras que ptr_c
y ptr_d
puede ser igual o desigual – ambos son válidos.
Parece que tiene un código que se puede compilar y probar fácilmente… ¿por qué no lo prueba?
– Thomas Owens
19 de enero de 2010 a las 19:35
No está preguntando si funciona o compila. Él está preguntando si ambas declaraciones tienen el mismo efecto (es decir, funcionan de la misma manera). A lo que la respuesta es no.
-Yannick Motton
19 de enero de 2010 a las 19:36
algo relacionado: stackoverflow.com/questions/2073079/…
– jldupont
19 de enero de 2010 a las 19:40
“¿Por qué no lo pruebas?” es una pregunta peligrosa cuando se trata de C y C++. Gran parte del comportamiento no está definido por el estándar (y, por lo tanto, generalmente es incorrecto que los programas invoquen el comportamiento), pero esto puede no ser evidente simplemente probando el código.
– Kef Schecter
1 jun 2017 a las 20:17