Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema con violación de segmento

Estas en el tema de Problema con violación de segmento en el foro de C/C++ en Foros del Web. Buenos días. Tengo un pequeño problema con un programa que, al ejecutarlo, me manda una violación de segmento. Os adjunto el código y os comento ...
  #1 (permalink)  
Antiguo 08/11/2014, 04:18
 
Fecha de Ingreso: noviembre-2014
Mensajes: 2
Antigüedad: 10 años
Puntos: 0
Problema con violación de segmento

Buenos días.

Tengo un pequeño problema con un programa que, al ejecutarlo, me manda una violación de segmento. Os adjunto el código y os comento sobre él.

Código:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
 
 
/*-------------------------------------
 *Programa creado por [email protected]
 *-------------------------------------
 **/
 
 
struct estructura {
 
    char * mensaje;
    int entero;
};
 
 
void * ejer6(void * arg) {
 
    printf("Entra dentro");
 
    struct estructura * turas;
    turas=(struct estructura *)arg;
 
    turas->entero=turas->entero+1;
    turas->mensaje[0]='9';
 
    printf("%d\n", turas->entero);
    printf("%s\n", turas->mensaje);
 
 
    pthread_exit(NULL);
}
 
 
 
int main(int argc, char ** argv) {
    if(argc!=2) {
        printf("Introduce el numero adecuado de parametros\n");
    }
    else {
 
        pthread_t h[argc];
        struct estructura turas[argc];
        int i;
 
        for(i=0; i<argc; i++) {
            turas[i].entero=13;
            turas[i].mensaje="Hola mundo";
        }
 
        for(i=0; i<argc; i++) {
 
            printf("\nEste es el valor de la estructura antes de la hebra: \n");
            printf("Entero: %d \n", turas[i].entero);
            printf("Mensaje: %s \n", turas[i].mensaje);
 
 
            pthread_create(&h[i], NULL, ejer6, (void *)&turas[i]);
            pthread_join(h[i], NULL);
 
            printf("\nEste es el valor de la estructura despues de la hebra: \n");
            printf("Entero: %d \n", turas[i].entero);
            printf("Mensaje: %s \n", turas[i].mensaje);
 
        }
    }
 
    return 0;
}
Bien, el caso es que entra en la función y me produce la violación de segmento al intentar acceder a la posición [0] del char * mensaje y ponerle el 9. Lo que me descoloca es que me da violación de segmento si trato de ponerle el '9' pero si intento hacer un printf de la posición 0 del char * me imprime 'H' por lo que sí está accediendo a la posición...seguramente sea una tontería que no esté viendo o no sé, pero que me tiene loco ya xD.

A ver si alguien pudiese echarme un cable :(
  #2 (permalink)  
Antiguo 08/11/2014, 07:47
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 10 años
Puntos: 13
Respuesta: Problema con violación de segmento

Cita:
Iniciado por DebianRDT Ver Mensaje
me produce la violación de segmento al intentar acceder a la posición [0] del char * mensaje y ponerle el 9. Lo que me descoloca es que me da violación de segmento si trato de ponerle el '9' pero si intento hacer un printf de la posición 0 del char * me imprime 'H' por lo que sí está accediendo a la posición
Eso ocurre debido a que turas->mensaje es un puntero a una cadena literal, el cual intentas modificar esto tiene un comportamiento indefinido en C, para el caso debes asignar memoria para turas->mensaje

Ejemplo:

Código C++:
Ver original
  1. turas[i].mensaje = malloc(strlen("Hola mundo")+1);

Saludos
  #3 (permalink)  
Antiguo 08/11/2014, 10:45
 
Fecha de Ingreso: noviembre-2014
Mensajes: 2
Antigüedad: 10 años
Puntos: 0
Respuesta: Problema con violación de segmento

Ya lo he solucionado, como dice Kutcher lo que intentaba no se podía hacer; como declaré en la estructura un char * no sabía que lo convertía a un const y claro, me dejaba verlo y no modificarlo.


He cambiado un poco el código y he hecho uso de strcpy y ahora va como la seda. Muchas gracias :)

Etiquetas: char, int, numero, programa, segmento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:54.