variable c pointers const

¿Por qué puedo cambiar el valor de una variable const char*?



const c# (6)

¿Por qué funciona el siguiente código en C?

const char* str = NULL; str = "test"; str = "test2";

Como str es un puntero a un carácter constante, ¿por qué se nos permite asignarle diferentes literales de cadena? Además, ¿cómo podemos proteger str de ser modificado? Parece que esto podría ser un problema si, por ejemplo, más tarde asignamos str a una cadena más larga que terminó escribiendo sobre otra parte de la memoria.

Debo añadir que en mi prueba, imprimí la dirección de memoria de str antes y después de cada una de mis tareas y nunca cambió. Entonces, aunque str es un puntero a un const char, la memoria en realidad está siendo modificada. Me preguntaba si quizás este es un problema heredado con C?


Además, ¿cómo podemos proteger str de ser modificado?

char * const str1; // str1 cannot be modified, but the character pointed to can const char * str2; // str1 can be modified, but the character pointed to cannot const char * const str3 // neither str3 nor the character pointed to can be modified.

La forma más fácil de leer esto es comenzar desde el nombre de la variable y leer a la izquierda:

  • str1 es un indicador constante de un personaje
  • str2 es un puntero a una hormiga const
  • str3 es un indicador constante de una hormona const horm

NOTA: la lectura de derecha a izquierda no funciona en el caso general, pero para declaraciones simples es una manera simple de hacerlo. Encontré un applet de Java basado en el código de "The C Programming Language" que puede descifrar las declaraciones con una explicación completa de cómo hacerlo.


Además, declarar una variable como const significa que la variable es de solo lectura; ¡no significa que el valor sea constante!


En una nota relacionada, definitivamente eche un vistazo a " const pointer versus puntero to const ". Ayuda con lo que algunas personas llaman const correctness . Lo guardo en mis marcadores para poder consultarlo de vez en cuando.


Está cambiando el puntero, que no es const (lo que apunta es const).

Si desea que el puntero sea const, la declaración se verá así:

char * const str = "something";

o

char const * const str = "something"; // a const pointer to const char const char * const str = "something"; // same thing

Los indicadores de Const para datos no const son usualmente una construcción menos útil que puntero-a-const.


La memoria para los literales de cadena se asignan en la pila, y todas sus asignaciones sí cambian el puntero str para apuntar a esas direcciones de memoria. El carácter constante al que apuntaba inicialmente no ha cambiado en absoluto.


Lo que estás buscando puede ser la sintaxis ...

const char* const str = NULL; str = "test"; str = "test2";

Observe el "const" después del char * que produce un error de compilación al intentar compilar / compilar.