entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problemas con punteros a cadena [C]

Hola!!

Alguien me podría orientar y decirme porque el programa deja de funcionar cuando tiene que hacer la asignación *aux = '\0'

El programa simplemente me muestra (o deberia mostrar) la cadena "AAA000" separada en "000" y "AAA"

#include <stdio.h>
#include <string.h>

int main(void)
{
   char *cadena = (char *)"AAA000";
   char *aux;
   printf("%s\n", cadena);
   aux = strchr(cadena, '\0');
   aux -= 3;
   printf("%s\n", aux);
   *aux = '\0';
   aux -= 3;
   printf("%s\n", aux);
   return 0;
}

1voto

juansolo comentado

En esta línea:

*aux = '\0'';

Defines el carácter nulo.

1voto

Looper comentado

Defino el carácter nulo porque quiero que el próximo printf que haga me lea solo la parte literal "AAA".

Según leí, parece que mi problema esta en que "AAA000" es un literal constante por eso no lo puedo modificar pero no estoy seguro.

0voto

juansolo comentado

Al realizar la asignación pierdes el contenido del literal por eso al ejecutar te genera "Violación del segmento" o "segmentation fault".

1 Respuesta

4votos

gcardozo Puntos540

Los literales (en especial las cadenas) son almacenados en un área de la memoria usada por la aplicación donde sólo hay acceso en modo lectura. Además, esta fuera de los segmentos de datos (DATA, HEAP, STACK) donde al programa se le permite escribir.

Compilando tu programa en GCC sobre Sistema Operativo Linux se replica el error, y usando el comando objdump -s -j .rodata <program>, puedes obtener una salida como esta:

./test_str:     file format elf64-x86-64

Contents of section .rodata:
 400630 01000200 41414130 303000             ....AAA000. 

Como se observa, el contenido de la cadena esta en la sección .rodata (Read-Only Data), y esta se encuentra fuera de las secciones donde se permite la escritura, como el código de la aplicación (.text). Por protección, el sistema operativo que maneja este formato de ejecución (ELF en este caso) notifica con un mensaje de "Segmentation Fault" y la terminación del programa. Este comportamiento puede variar de un compilador o formato de ejecución a otro, pero en general es este.

0voto

Leonardo-Tadei comentado

Muy buena respuesta!
Y cómo podría @juansolo asignar el valor para que no sea un string literal???

1voto

juansolo comentado

Usando la función malloc o creando un array. Por ejemplo:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main(void)
{
  unsigned char longitud_cadena = 6;
  char* cadena = (char*) malloc(sizeof(char) * longitud_cadena);

  if (cadena == NULL) {
    printf("No puedo reservar memoria para la cadena de caracteres.\n");
    return 1;
  }

  strcpy(cadena, "AAA000");
  char* apuntador = cadena;

  printf("Cadena:\n\tContenido: %s\n\tDirección: %p\n", cadena, cadena);
  printf("Apuntador:\n\tContenido: %s\n\tDirección: %p\n", apuntador, apuntador);

  unsigned char i = 0;
  while (*apuntador != '\0') {
    printf("%c", *apuntador);
    if(i == 2) {
      printf("\n");
    }
    apuntador++;
    i++;
  }
  printf("\n");

  free(cadena);  

  return 0;
}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta