¿Estas afirmaciones sobre punteros tienen el mismo efecto?

3 minutos de lectura

Haz esto…

char* myString = "hello";

… tiene el mismo efecto que esto?

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

  • 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

avatar de usuario
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 constpor lo que puede cambiar cualquier carácter (ya sea directamente en la matriz o mediante un puntero) a voluntad sin efectos negativos.

avatar de usuario
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad