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

Extraña violacion del segmento

Estas en el tema de Extraña violacion del segmento en el foro de C/C++ en Foros del Web. Buenas, estaba haciendo un fichero de .cfg y una mini-funcion que leyera el fichero y rellenara una estructura con la .cfg correspondiente, aqui el codigo: ...
  #1 (permalink)  
Antiguo 08/07/2008, 10:29
 
Fecha de Ingreso: marzo-2008
Mensajes: 37
Antigüedad: 16 años, 1 mes
Puntos: 0
Extraña violacion del segmento

Buenas, estaba haciendo un fichero de .cfg y una mini-funcion que leyera el fichero y rellenara una estructura con la .cfg correspondiente, aqui el codigo:


Código:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#include "cadenas.h"

#define EQ(str1,str2) (strcmp((str1),(str2))==0)
#define FF(str1) str1[lcadena(str1)-1]=0


int
main(int argc, char **argv)
{

FILE *df=NULL;
struct usuario_config *config;
char buffer[81];
char *distintive=NULL;
char *part=NULL;
int i=0;
               



 
              if((df=fopen(argv[1],"rt"))==NULL)
                {
                    perror(argv[1]);
                    exit(-1); 
                }
            
            
          for(; (fgets(buffer,80,df))!=NULL ; i=0,memset(buffer,sizeof(buffer),'\0'),printf("Aqui me quedo\n"))
            {  
               
               FF(buffer);
                            
                  
               while(buffer[i++]!='='); 
                
                distintive=(char *)malloc(i*sizeof(char));            
part=&buffer[i];     
   
               
               distintive=return_char(buffer,i-1,1);
              
               

                 if(EQ(distintive,"nick"))
                  {
                //    printf("nick\n");
                    config->nick=strdup(part);
                   printf("NICK->%s\n",config->nick);
                  }
                else if(EQ(distintive,"path"))
                  {
                  //  printf("path\n");
                    config->path=strdup(part);
                    printf("PATH->%s\n",config->path);
                  }
                else if(EQ(distintive,"nombre"))
                  {
                   // printf("Nombre\n");
                    config->path=strdup(part);
                    printf("Nombre->%s\n",config->path);
                  }
                else if(EQ(distintive,"puerto"))
                  {
                    //printf("port\n");
                    config->puerto=strdup(part);
                    printf("PORT->%s\n",config->puerto);
                  }
                else if(EQ(distintive,"edad"))
                  {
                    //printf("edad\n");
                    config->edad=strdup(part);
                    printf("Edad->%s\n",config->edad);
                  }  
                 else
                   printf("cfg->erronea\n");                            
                   
                                
                   free(distintive);
 
         }

    fclose(df);

return 0;

}
La estructura es asi:

Código:
struct usuario_config
{
  char *nombre;
  char *nick;
  unsigned char *edad;
  unsigned char *puerto;
  char *path;
};

Pues bien, el programa avanza hasta el 4 for que se ejecutara, cuando va a lanzar el 5, me da el fallo de segmentacion despues de mostrar: Aqui me quedo en el for. Un ejemplo:

Código:
PORT->2331
Aqui me quedo
NICK->Leber
Aqui me quedo
Edad->90
Aqui me quedo
PATH->/home/liquid/path
Aqui me quedo
Segmentation fault
Como veis, cuando va a lanzar el 5, se queda cortado, y la verdad no entiendo el error, depuree el programa con printf y es ahi donde se cuelga. Yo creo que porque uno de los 2 punteros esta apuntando hacie algo que no deberia, pero no caigo, a ver si me podeis echar un cable.

Gracias de antemano, y un saludo
  #2 (permalink)  
Antiguo 08/07/2008, 21:36
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Extraña violacion del segmento

No estas asignando memoria para config:

Código:
int main(int argc, char **argv)
{
	FILE *df=NULL;
	struct usuario_config *config;  // Es un apuntador de la estructura, pero no apunta a ningún lado especifico.
	char buffer[81];
	char *distintive=NULL;
	char *part=NULL;
	int i=0;

	if((df=fopen(argv[1],"rt"))==NULL)
	{
		perror(argv[1]);
		exit(-1); 
	}

	// Falta esta linea:
	config=(struct usuario_config*)malloc(sizeof(struct usuario_config)); 

	for(; (fgets(buffer,80,df))!=NULL ; i=0,memset(buffer,sizeof(buffer),'\0'),printf("Aqui me quedo\n"))
	{  
		....
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 19:23.