Un problema oscuro en C
Tú y tus compañeros no lo entienden del todo bien
Diferenciemos:
char *p="sdfjsd"
; char p[7]="sdfjsd";
char *p="sdfjsd";
El compilador optimizará y guardará "sdfjsd" en el área constante, "sdfjsd" es también se utiliza como constante,
y p apunta a la primera dirección de esta cadena constante.
Entonces *p='a' significa asignar un valor al área constante, por lo que se informa un error.
char p[7]="sdfjsd";,
El compilador asigna 7 espacios de direcciones continuas de tipo char en el área de la pila,
yp Apunta a la primera dirección de esta área de pila.
Entonces *p='a' significa asignar valor al área de la pila, no hay problema.
Hablemos de otra diferencia:
char *p="sdfjsd"
char *q="sdfjsd"
; Escrito así, pyq en realidad apuntan a la misma dirección
Como acabo de decir, para cadenas constantes, el compilador optimizará y guardará solo un "sdfjsd" en el área constante
. p>Entonces p y q apuntan a la misma dirección
char p[7]="sdfjsd"
char q[7]="sdfjsd"; p>
p>
Escrito así, p y q apuntan a diferentes direcciones. Esto es relativamente simple, así que no entraré en detalles
========. ========== ==============
Suplemento de pregunta: De hecho, también creo que "sdfjsd" es una cadena constante, por lo que Habrá una excepción al asignarle un valor, pero si es así, ¿por qué el compilador no informa un error durante la compilación en lugar de esperar hasta el tiempo de ejecución para informar una excepción? Por ejemplo, el compilador puede exigirnos que usemos un tipo Const. puntero a referencia durante la inicialización, const char *p="sdkfjls ";
============================= ===
El compilador no es tan inteligente.
Si utiliza una herramienta de análisis de código estático (por ejemplo: QAC), puede descubrirlo.