Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

169
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda