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 :

Segmentation fault


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut Segmentation fault
    Bonsoir,

    voilà je dois faire un script qui accepte des messages entré par l'utilisateur dans un tableau lorsque celui sera rempli il s'allongera en qq sorte.

    Seulement lors de l'ajout d'un message il me met Segmentation fault !

    Voici le code en question, je ne met pas ma main il envoit juste la chaine de caractère à ma fonction Add...
    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
    38
    39
    40
     
    void gmAdd(char *pMsg, int *pRC) {
        /*
            Si le tableau est rempli ajout d'un nouveau bloc de n bit => réallocation 
            Si réallocation OK, on poursuis pour l'ajout de l'élément
         */  
     
        if ((gCurrentPos % BLOCK) == 0) { // modulo entre la position courante et le nombre de block
     
            if ((slc_tab = (char**) realloc(slc_tab, (gCurrentPos + BLOCK) * sizeof (char*))) == NULL) {
     
                *pRC = GM_ERROR;
                puts("Realloc Failed");
                return;
            } 
        }
     
        /*
            Placement dans slc_tab[gCurrentPos] l'adresse réservé pour le char
            Vérification si l'allocdation mémoire c'est bien passé => <> NULL
         */
     
        if ((slc_tab[gCurrentPos] = (char*) malloc((strlen(pMsg) + 1) * sizeof (char))) == NULL) // +1 pour message avec le \0
        // On Cast le malloc en disant que c'est de type char
        {
            puts("Alloc Char Failed");
            *pRC = GM_ERROR;
     
            return;
        } 
     
        /* 
          Copie du message dans le tableau 
          Incrémentation de la position courante 
         */
     
        strcpy(slc_tab[gCurrentPos],pMsg);  // ICI OU SE PASSE L' ERREUR !!!!!!
        gCurrentPos++;
        *pRC = GM_OK;
    }
    voilà, je vous remercie d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par sharky03 Voir le message
    Voici le code en question, je ne met pas ma main il envoit juste la chaine de caractère à ma fonction Add...
    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
    08-11-18.c: In function 'gmAdd':
    08-11-18.c:8: error: 'gCurrentPos' undeclared (first use in this function)
    08-11-18.c:8: error: (Each undeclared identifier is reported only once
    08-11-18.c:8: error: for each function it appears in.)
    08-11-18.c:8: error: 'BLOCK' undeclared (first use in this function)
    08-11-18.c:10: error: 'slc_tab' undeclared (first use in this function)
    08-11-18.c:10: warning: implicit declaration of function 'realloc'
    08-11-18.c:10: error: 'NULL' undeclared (first use in this function)
    08-11-18.c:12: error: 'GM_ERROR' undeclared (first use in this function)
    08-11-18.c:13: warning: implicit declaration of function 'puts'
    08-11-18.c:23: warning: implicit declaration of function 'malloc'
    08-11-18.c:23: warning: incompatible implicit declaration of built-in function 'malloc'
    08-11-18.c:23: warning: implicit declaration of function 'strlen'
    08-11-18.c:23: warning: incompatible implicit declaration of built-in function 'strlen'
    08-11-18.c:37: warning: implicit declaration of function 'strcpy'
    08-11-18.c:37: warning: incompatible implicit declaration of built-in function 'strcpy'
    08-11-18.c:39: error: 'GM_OK' undeclared (first use in this function)
    Un code minimaliste qui compile serait quand même pas mal : on risque de gagner du temps.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    const int BLOCK = 2;
    int gCurrentPos = 0;
    char **slc_tab = NULL;
    void gmAdd(char *pMsg)
    {
        if ((gCurrentPos % BLOCK) == 0) {
            if ((slc_tab =
                 realloc(slc_tab,
                         (gCurrentPos + BLOCK) * sizeof(char *))) == NULL) {
                puts("Realloc Failed");
                return;
            }
        }
        if ((slc_tab[gCurrentPos] = malloc((strlen(pMsg) + 1))) == NULL) {
            puts("Alloc Char Failed");
            return;
        }
     
        strcpy(slc_tab[gCurrentPos], pMsg);
        printf("%d \"%s\"\n", gCurrentPos, slc_tab[gCurrentPos]);
        gCurrentPos++;
    }
     
    int main(void)
    {
        size_t i;
        for (i = 0; i < 128; ++i) {
            char foo[64];
            sprintf(foo, "<%u>", i);
            gmAdd(foo);
        }
        return 0;
    }
    ... Pas de problème apparent à l'exécution.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut
    Citation Envoyé par mabu Voir le message
    ... Pas de problème apparent à l'exécution.
    Salut Mabu, merci pour ton test

    Je vais mettre mes autres codes en relation c'est à dire main et header

    Main
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "functionVers2.h"
     
    #define INIT 'i'
    #define ADD 'a'
    #define DISPLAY 'd'
    #define EXIT 'e'
     
    int main() {
     
        int dRC;
        char reponse[3];
        char sMsg [50];
        char clavUtil = 'i';
     
        puts("Table Initialisation ");
        gmInit(&dRC);
     
        do {
            puts("\n\nChoose what u want\nI : Initialisation\nD : Display\nA"
            ": Add\nE : Exit \n  => ");
            fgets(reponse, sizeof reponse, stdin);
            clavUtil=reponse[0];
            switch (clavUtil) {
                case INIT: gmInit(&dRC);
                    break;
                case ADD: puts("Put Ur Error Message\n");
                    fgets(sMsg, sizeof sMsg, stdin);
                    gmAdd(sMsg, &dRC);
                    if (dRC == GM_FULL) {
                        puts("Error : The Table's Full");
                    } else if (dRC == GM_ERROR) {
                        puts("Error : Program 's Closing");
                        EXIT_FAILURE;
                    }
                    break;
                case DISPLAY: gmDisplay(&dRC);
                    break;
                case EXIT: return 0;
     
                default: puts("/n Veuillez entrez une lettre correspondante");
                    break;
            }
        } while (clavUtil != EXIT);
        return 0;
    }

    Header
    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
     
     
    #ifndef _FUNCTIONVERS2_H
    #define	_FUNCTIONVERS2_H
     
    #define GM_OK 0
    #define GM_ERROR 1
    #define GM_FULL 2
     
    void gmInit(int *pRC); // Initialisation 
    void gmAdd (char *pMsg, int *pRC); // Insertion d'un message
    void gmDisplay (int *pRC); // Affichage de tous les messages
     
    #ifdef	__cplusplus
    extern "C" {
    #endif
    mais je vois pas pourquoi elle serait fausse, pour les différents excercices qu'on doit faire sur la gestion des messages, on doit pouvoir gardé la même main

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    il y a un probleme avec ton header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    In file included from main.c:3:
    functionVers2.h:1:1: error: unterminated #ifndef
    Je pense qu'il manque la fin

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par sharky03 Voir le message
    voilà je dois faire un script qui accepte des messages entré par l'utilisateur dans un tableau lorsque celui sera rempli il s'allongera en qq sorte.

    Entre parenthèse, tu ne fais pas un script mais un programme..

    Un script est en général un petit programme interprété directement par l'OS.

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par sharky03 Voir le message
    mais je vois pas pourquoi elle serait fausse, pour les différents exercices qu'on doit faire sur la gestion des messages, on doit pouvoir gardé la même main
    Vi mais de mon côté, je ne suis pas encore devin.

    • Les variables globales sont elles correctement initialisées ?
    • BLOCK a-t-il une valeur cohérente ?
    • Est ce que ça crashe à chaque fois ou de façon plus ou moins aléatoire ?
    • Quelle tête a pMsg quand ça crashe ?

  8. #8
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    bon le code donné ne compile pas (manque la fin du header des declarations de variables, le corps des méthodes gmInit et gmDisplay...)

    mais bon ca plante quand tu essayes d inserer un message plus long que la taille du tableau sMsg (a savoir 50).

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par BainE Voir le message
    mais bon ca plante quand tu essayes d inserer un message plus long que la taille du tableau sMsg (a savoir 50).
    Sur ?
    fgets est capable de découper automatiquement les entrées trop grandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(void)
    {
        char msg[5];
        while(1) {
            fgets(msg, sizeof msg, stdin);
            printf("msg is \"%s\"\n", msg);
        }
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Un texte trop long
    msg is "Un t"
    msg is "exte"
    msg is " tro"
    msg is "p lo"
    msg is "ng
    "

  10. #10
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    en fait ca plante pas, mais c est quand le message est trop long et qu il rencontre un 'e' dans la fin de phrase non mangé par le fgets, il sort dans le switch case.

    la premiere lettre non lu par fgets de mon test etait un e, c est pour ca que j ai cru que ca plantait
    Et pis j'etais sur de l avoir vu planter sur le strcpy... dsl

    bon, avec un fpurge ca tourne mieux et pas de bug,
    peut etre que ca vient des init que tu a fais Mabu et qu on a pas vu dans le code original.

    Peux tu envoyer tout le code sharky03 stp

    [edit]
    P.S. sharky03 tu va devoir gerer les chaines plus longues que ton tableau, soit en bouclant fgets tant qu'il y a des choses a lire soit en tranquant le reste, pour ca cherche la fonction fpurge qui tourne sur plein de thread du forum.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut
    Re

    bonjour,

    bon le code donné ne compile pas (manque la fin du header des declarations de variables, le corps des méthodes gmInit et gmDisplay...)

    mais bon ca plante quand tu essayes d inserer un message plus long que la taille du tableau sMsg (a savoir 50).
    En effet, je me suis précipité puis copier le code. En plus, je n'avais pas mis toute la page avec mes fonctions comme signalé par Mabu

    mais lors de l'insertion de mes messages je ne dépassais pas 50 charactères.

    voici donc le code du programme (merci souviron34) en entier

    header :

    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
     
     
    #ifndef _FUNCTIONVERS2_H
    #define	_FUNCTIONVERS2_H
     
    #define GM_OK 0
    #define GM_ERROR 1
    #define GM_FULL 2
     
    void gmInit(int *pRC); // Initialisation 
    void gmAdd (char *pMsg, int *pRC); // Insertion d'un message
    void gmDisplay (int *pRC); // Affichage de tous les messages
     
    #ifdef	__cplusplus
    extern "C" {
    #endif
     
     
     
     
    #ifdef	__cplusplus
    }
    #endif
     
    #endif	/* _FUNCTIONVERS2_H */

    Fonction :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include "functionVers2.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define BLOCK 1
     
    static char *slc_tab = NULL; // Tableau qui n'est plus de taille fixe comme dans la version 1
    static int gCurrentPos = 0;
     
    /*
        Initialisation du tableau avec le nombre de bit voulu (BLOCK)
     */
     
    void gmInit(int *pRC) {
     
        if ((slc_tab = (char*) malloc(BLOCK * sizeof (char))) == NULL) {
     
            *pRC = GM_ERROR;
            puts("Init Error Malloc");
            return;
        }
        gCurrentPos = 0;
        *pRC = GM_OK;
    }
     
    /* Ajout d'un élément dans le tableau */
     
    void gmAdd(char *pMsg, int *pRC) {
        /*
            Si le tableau est rempli ajout d'un nouveau bloc de n bit => réallocation 
            Si réallocation OK, on poursuis pour l'ajout de l'élément
         */
     
        if (((gCurrentPos % BLOCK) == 0) && (gCurrentPos >= (BLOCK)))
        {
            // modulo entre la position courante et le nombre de block
     
            if ((slc_tab = (char**) realloc(slc_tab, (gCurrentPos + BLOCK) * sizeof (char*))) == NULL)
            {
     
                *pRC = GM_ERROR;
                puts("Realloc Failed");
                return;
            }
        }
     
        /*
            Placement dans slc_tab[gCurrentPos] l'adresse réservé pour le char
            Vérification si l'allocdation mémoire c'est bien passé => <> NULL
         */
     
        if ((slc_tab[gCurrentPos] = (char*) malloc((strlen(pMsg) + 1) * sizeof (char))) == NULL) // +1 pour message avec le \0
            // On Cast le malloc en disant que c'est de type char
        {
            puts("Alloc Char Failed");
            *pRC = GM_ERROR;
            return;
        }
     
        /* 
          Copie du message dans le tableau 
          Incrémentation de la position courante 
         */
     
        strcpy(slc_tab[gCurrentPos], pMsg);
        gCurrentPos++;
        *pRC = GM_OK;
    }
     
    /* Affichage des valeurs */
     
    void gmDisplay(int *pRC) {
        int dInd; // Index
        *pRC = GM_OK;
        for (dInd = 0; dInd < 5; dInd++) { // 5 n'est pas une bonne valeurs
            printf("\n Message n° %d = %s", dInd + 1, slc_tab[dInd]);
        }
    }
    Main

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "functionVers2.h"
     
    #define INIT 'i'
    #define ADD 'a'
    #define DISPLAY 'd'
    #define EXIT 'e'
     
    int main() {
     
        int dRC;
        char reponse[3];
        char sMsg [50];
        char clavUtil = 'i';
     
        puts("Table Initialisation ");
        gmInit(&dRC);
     
        do {
            puts("\n\nChoose what u want\nI : Initialisation\nD : Display\nA"
            ": Add\nE : Exit \n  => ");
            fgets(reponse, sizeof reponse, stdin);
            clavUtil=reponse[0];
            switch (clavUtil) {
                case INIT: gmInit(&dRC);
                    break;
                case ADD: puts("Put Ur Error Message\n");
                    fgets(sMsg, sizeof sMsg, stdin);
                    gmAdd(sMsg, &dRC);
                    if (dRC == GM_FULL) {
                        puts("Error : The Table's Full");
                    } else if (dRC == GM_ERROR) {
                        puts("Error : Program 's Closing");
                        EXIT_FAILURE;
                    }
                    break;
                case DISPLAY: gmDisplay(&dRC);
                    break;
                case EXIT: return 0;
     
                default: puts("/n Veuillez entrez une lettre correspondante");
                    break;
            }
        } while (clavUtil != EXIT);
        return 0;
    }
    voilà

    bon, avec un fpurge ca tourne mieux et pas de bug,
    de mon côté, je vais me documenter sur ce fpurge.

    Ecore un grand merci à tous

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Commence par corriger ces erreurs dans ton code.
    C'est la base de la programmation, regarder les avertissements du compilateur et les corriger...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    main.c: In function ‘main’:
    main.c:35: warning: statement with no effect
    functionVers2.c: In function ‘gmAdd’:
    functionVers2.c:38: warning: assignment from incompatible pointer type
    functionVers2.c:52: warning: assignment makes integer from pointer without a cast
    functionVers2.c:52: warning: comparison between pointer and integer
    functionVers2.c:65: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast
    functionVers2.c: In function ‘gmDisplay’:
    functionVers2.c:76: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut
    Commence par corriger ces erreurs dans ton code.
    Salut, chez moi je n'ai pas d'erreus j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Running "/usr/bin/gnome-terminal --disable-factory --hide-menubar --title="dist/Debug/GNU-Linux-x86/version2 " -x "/home/oli/netbeans-6.5rc1/cnd2/bin/dorun.sh" -p "[Press Enter to close window]" -f "/tmp/nbcnd_rc41373" dist/Debug/GNU-Linux-x86/version2 " in /home/oli/Documents/C++/Excercice2/Version2
    merci

  14. #14
    Invité(e)
    Invité(e)
    Par défaut
    Trouvé : il y a confusion des genres :

    slc_tab est déclaré comme pointeur sur char, utilisé comme tel dans gmInit.

    En revanche, il est utilisé comme pointeur sur pointeur de char dans gmAdd....

    Au premier passage dans gmAdd, on tente de stocker une adresse de chaine de caractère dans le premier élément de slc_tab... normal que ça coince.

    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
     
    static char ** slc_tab = NULL; // Tableau qui n'est plus de taille fixe comme dans la version 1
    static int gCurrentPos = 0;
     
    /*
        Initialisation du tableau avec le nombre de bit voulu (BLOCK)
     */
     
    void gmInit(int *pRC) {
     
        if ((slc_tab = malloc(BLOCK * sizeof (*slc_tab))) == NULL) {
     
            *pRC = GM_ERROR;
            puts("Init Error Malloc");
            return;
        }
        gCurrentPos = 0;
        *pRC = GM_OK;
    }
    PS : il est inutile de caster les retour de malloc.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par sharky03 Voir le message
    Salut, chez moi je n'ai pas d'erreus j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Running "/usr/bin/gnome-terminal --disable-factory --hide-menubar --title="dist/Debug/GNU-Linux-x86/version2 " -x "/home/oli/netbeans-6.5rc1/cnd2/bin/dorun.sh" -p "[Press Enter to close window]" -f "/tmp/nbcnd_rc41373" dist/Debug/GNU-Linux-x86/version2 " in /home/oli/Documents/C++/Excercice2/Version2
    merci
    Je parlais de la compilation, et pas du lancement.
    En passant si tu apprends le C pôuruqoi travaille tu dans un dossier appelé C++, et évite d'utiliser des logiciels qui font des choses que tu ne comprends pas.
    Il vaut mieux compiler et lancer a la main.
    gcc, Makefile etc...

  16. #16
    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
    Le code de gmAdd indique que les éléments du tableau pointé par slc_tab sont des pointeurs sur char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
            if ((slc_tab = (char**) realloc(slc_tab, (gCurrentPos + BLOCK) * sizeof (char*))) == NULL)
    ...
        if ((slc_tab[gCurrentPos] = (char*) malloc((strlen(pMsg) + 1) * sizeof (char))) == NULL) // +1 pour message avec le \0
    ...
        strcpy(slc_tab[gCurrentPos], pMsg);
    Ceci est incompatible avec sa déclaration (pourquoi des variables globales ?) et avec le code de gmInit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    static char *slc_tab = NULL;
    ...
    void gmInit(int *pRC) {
     
        if ((slc_tab = (char*) malloc(BLOCK * sizeof (char))) == NULL) {
     
            *pRC = GM_ERROR;
            puts("Init Error Malloc");
            return;
        }
        gCurrentPos = 0;
        *pRC = GM_OK;
    }
    L'allocation de char au lieu de char* donne un nombre de bytes trop faible d'où erreur de segmentation.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Par défaut
    Trouvé : il y a confusion des genres :

    slc_tab est déclaré comme pointeur sur char, utilisé comme tel dans gmInit.

    En revanche, il est utilisé comme pointeur sur pointeur de char dans gmAdd....

    Au premier passage dans gmAdd, on tente de stocker une adresse de chaine de caractère dans le premier élément de slc_tab... normal que ça coince.
    En effet, c'était ça. A vrai dire j'ai du mal avec les ** malloc, ...

    Je parlais de la compilation, et pas du lancement.
    En passant si tu apprends le C pôuruqoi travaille tu dans un dossier appelé C++, et évite d'utiliser des logiciels qui font des choses que tu ne comprends pas.
    Il vaut mieux compiler et lancer a la main.
    gcc, Makefile etc...
    En faite, je pensais qu'il mettrai les erreurs de compilation aussi, mais en effet j'avais la même chose que toi.

    Pour ce qui est du dossier c++, c'est pcq on commence en c puis on continuera avec le c++, c'est dans le même cours.

    Pour ce qui du programme, c'est parce que c'est celui qu'on uilise au cours, sinon je tenterai bien de le faire comme tu dis.


    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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