resueltos - Constantes de cadena vs matrices de caracteres en C
imprimir cadena de caracteres en c (3)
Con una cadena constante, no hay garantía sobre dónde se almacenarán los datos: el compilador puede hacer los trucos que quiera, porque se supone que tiene prohibido escribir en ellos. Así que, por ejemplo, no es extraño que el puntero señale realmente el lugar en el código ejecutable cargado donde se define la constante de cadena.
Posible duplicado:
¿Cuál es la diferencia entre char s [] y char * s en C?
Más que una pregunta general en lugar de tratar de arreglar algo, he estado leyendo el libro de lenguaje de programación C y se preocupan por hacer la distinción entre
char amessage[] = "blah";
char *pmessage = "blah";
La diferencia es que uno es una matriz de caracteres y el otro un puntero a una constante de cadena. Dicen que es aceptable modificar la matriz char pero no modificar las constantes de cadena ya que desencadena un comportamiento indefinido. Mi pregunta es: ¿la constante de cadena no está almacenada en la memoria de la misma manera que la matriz de caracteres? ¿Por qué puedo modificarlo como en
char *p = "this is a string constant";
*(p+2) = ''a'';
printf("%s", p);
Termina imprimiendo "thas es una cadena constante" como cabría esperar. Puedo entender cómo tendría sentido, ya que una constante de cadena no debería cambiarse en el tiempo de ejecución, ya que podría confundir a otros / usted trabajando en su código sin esperar que su valor cambie, pero en términos puramente funcionales, lo que está mal con él , ¿cuál es el comportamiento indefinido que podría desencadenar y cómo mecánicamente podría ser contraproducente cuando una matriz de caracteres no lo haría? Me pregunto si me falta algo sobre cómo funcionan las constantes de cadena en la memoria y cómo el compilador las ve.
En el caso de una matriz de caracteres, el contenido de la cadena literal "blah"
se copia en la pila. Entonces puedes modificarlo sin invocar a UB porque después de todo es solo una copia.
En el caso de char *
realmente intentas modificar el literal original de la cadena y según el estándar que es UB.
Al menos en mi computadora, el siguiente programa se bloquea:
#include <stdio.h>
int main() {
char *p = "this is a string constant";
*(p+2) = ''a'';
printf("%s", p);
}
Si parece estar funcionando para usted (lo que podría ocurrir en ciertos compiladores integrados), simplemente tiene suerte. El comportamiento indefinido significa que el programa puede hacer cualquier cosa. Ver http://blog.regehr.org/archives/213 .
Ver también ¿Cuál es la diferencia entre char s [] y char * s? .