Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

163
Views
Confusión sobre los punteros de caracteres en C

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?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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]
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!