IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Segfault sur un malloc[Contourné]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 54
    Par défaut Segfault sur un malloc[Contourné]
    Bonjour à tous !

    Je suis en train de faire un programme de type Cloud en C, mais je bloque sur pas mal de trucs...

    Voilà déjà la fonction qui pose problème, son rôle est de récupérer un pseudo d'un client, de regarder dans une liste d'inscrits si le pseudo existe et d'agir en conséquence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    static void * gestion(void * socket){
        printf("Dialogue en cours\n");
        char buffer[512];
        int client=*((int*)socket);
        int lu = read(client,buffer, 512);
        char *pseudo=malloc(lu);
        strncpy(pseudo,buffer,lu);
        printf("le serveur a recu: %s\n",buffer);
        FILE *f;
        f=fopen("inscrits","a+");
        char * line;
        size_t taille;
        int boolean=0;
        if(f!=NULL){
            lu = getline(&line,&taille,f);
            while((lu!=-1)&&boolean==0){
                printf("%s",pseudo);
                char * line2=malloc(lu*sizeof(char));
                strncpy(line2,line,lu-1);
                printf("%s",line2);
                if(strcmp(line2,pseudo)==0) boolean=1;
                printf("\n%d",boolean);
                lu=getline(&line,&taille,f);
                free(line2);
            }
            if(boolean) miseajour(pseudo);
            else creer(pseudo,f);
        }
        write(client,buffer, 512);
        shutdown(client,2);
        fclose(f);
        close(client);
        pthread_exit(NULL);
    }

    Premier problème : le deuxième malloc, celui dans le while, me donne une segfault dans tout les cas, sauf si j'enlève le premier malloc, celui de "pseudo"...

    Deuxième soucis, qui m'a amené à faire des malloc partout tongue : je n'arrive pas à comparer mes deux chaines avec un résultat correct. Un coup c'est buffer qui contient des caractères qu'il ne devrait pas avoir ( d'où l'utilisation de pseudo ), un coup c'est le \n dans line qui ne veut pas partir... ( D'où line2, mais on revient au premier problème... )

    J'ai essayé aussi cette fonction récupérée sur le net, mais qui ne renvoie qu'une chaine vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char* strRemoveCRLF(char *psz)
    {
      char *d = psz; // POINTEUR D'ECRITURE
      while(*psz) {
        if((*psz != '\r') && (*psz != '\n')) *d++ = *psz;
        psz++;
      }
      *d = 0;
      return d;
    }
    J'ai modifié mon code de toutes les façons que j'ai pu imaginer, rien ne va. Si vous avez une idée qui marche, je vous épouse sur le champ ! Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je crois que tu as un problème sur getline() + sur le zéro terminal des chaines
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char * line;
        size_t taille;
        ....
        if(f!=NULL){
            lu = getline(&line,&taille,f);....
    - line n'est pas initialisé à NULL et contient une valeur qui pointe vers n'importe quoi (ainsi que taille). getline()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            lu = getline(&line,&taille,f);
            while((lu!=-1)&&boolean==0){
                ....
                char * line2=malloc(lu*sizeof(char));
                strncpy(line2,line,lu-1);
                ....
                if(strcmp(line2,pseudo)==0) boolean=1;
    - line2 ne contient pas le zéro terminal avant la comparaison

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Deux choses que tu faudrait corriger instamment (pardon de mon mauvais francais):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lu = getline(&line,&taille,f);
    utilise line pour prendre la chaîne des caractères, mais malloc n'ést pas utilisé pour reserver la mémoire pour la variable line.

    strRemoveCRLF fait le retour de d qui est un pointeur sur zero, parce que d est incrément chaque fois dans le boucle. Le psz est un pointeur sur un chaine des caractères sans CRLF, est il n'y a pas de sens de faire le retour de d.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 54
    Par défaut
    Bonjour et merci pour vos réponses.

    J'ai finalement pondu un truc qui marchait entre temps ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    static void * gestion(void * socket){
        printf("Dialogue en cours\n");fflush(stdout);
        char buffer[512];
        int client=*((int*)socket);
        int lu = read(client,buffer, 512);
        printf("le serveur a recu: %s\n",buffer);
        FILE *f;
        f=fopen("inscrits","a+");
        char * line;
        size_t taille;
        int boolean=0;
        if(f!=NULL){
            getline(&line,&taille,f);
            while((taille!=-1)&&boolean==0){
                printf("%s",buffer);
                strRmvCR(line);
                printf("%s",line);
                if(strcmp(line,buffer)==0) boolean=1;
                printf("%d\n",boolean);
                getline(&line,&taille,f);
            }
     
        }
        if(boolean) miseajour(buffer);
        else creer(buffer,f);
        write(client,buffer, 512);
        shutdown(client,2);
        fclose(f);
        close(client);
        pthread_exit(NULL);
    }
     
    void strRmvCR(char * chaine){
        int i= 0;
        while(chaine[i]!='\n'&&chaine[i]) i++;
        chaine[i]=0;
    }
    Je vais quand même initialiser line à null pour éviter les soucis ^^ Merci de votre aide !

Discussions similaires

  1. problème sur un malloc
    Par nicodn02 dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 17/01/2008, 20h51
  2. Segfault sur contructeur de string
    Par lemmel dans le forum SL & STL
    Réponses: 7
    Dernier message: 02/09/2007, 13h50
  3. Segfault étrange sur un malloc
    Par |PaRa-BoL dans le forum C
    Réponses: 38
    Dernier message: 17/01/2007, 14h57
  4. Réponses: 6
    Dernier message: 07/05/2006, 21h42
  5. blocage bizarre sur un malloc
    Par gilux dans le forum C
    Réponses: 13
    Dernier message: 24/01/2006, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo