Los punteros de caracteres en C me confunden.
Supongamos que tenemos un puntero char, que apunta al primer carácter de la constante de cadena.
char *a="ABCD";Entonces no podemos cambiar el valor de ese carácter usando el puntero a, ya que la siguiente declaración da como resultado una falla de segmentación.
*a='X';Ahora supongamos que tenemos un puntero char, que apunta a una constante de carácter.
const char B='X'; char *ptr=&B;Entonces podemos cambiar el valor de ese carácter usando la declaración
*ptr='Z';Mi pregunta es si este es un caso de comportamiento indefinido que prueba que C no es robusto. ¿O hay alguna lógica más profunda involucrada?
Digamos que C te permite pegarte un tiro en el pie con bastante facilidad. Sin embargo, modificar B sigue siendo un comportamiento indefinido, al igual que modificar *a , porque B ha sido declarado const .
Para ayudar con esto, activar las advertencias (que siempre debe hacer a menos que se den circunstancias muy específicas) muestra lo siguiente en GCC:
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]En C, no se permite la modificación del literal de cadena.
char *a="ABCD";es equivalente a
char const *a="ABCD"; *a='X'; está modificando el literal de cadena ABCD . Mientras que en el segundo caso, ptr apunta a un carácter que se supone que no debe cambiarse y *ptr='Z'; modificará el contenido de la ubicación que contiene X , que tampoco es válido.
Tenga en cuenta que modificar un objeto calificado const es una violación de restricción.
La razón por la que el puntero se comporta de manera diferente es que el programa C tiene varios segmentos de memoria, algunos de los cuales están protegidos.
Entonces no podemos cambiar el valor de ese carácter usando el puntero a, ya que la siguiente declaración da como resultado una falla de segmentación.
A diferencia de otras constantes, las constantes de cadena se colocan en un segmento protegido. Cualquier intento de modificar este segmento da como resultado un comportamiento indefinido (es decir, su programa podría fallar).
Dado que su puntero apunta a una constante de cadena, el valor al que apunta no se puede modificar. Si fuerza una copia de la constante en la memoria modificable mediante el uso de una matriz, se permitiría la misma modificación:
char a[]="ABCD"; *a='X';Entonces podemos cambiar el valor de ese carácter [único] usando la declaración
Esto se debe a que la constante de carácter siempre se copia en la memoria modificable.