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 :

Erreur de segmentation


Sujet :

C

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 35
    Par défaut Erreur de segmentation
    Bonjour,

    Voilà mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x8f88340 (LWP 3494)] 0xb7e7470a in ?? () from /lib/i386-linux-gnu/libc.so.6
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct
    {
    	char * key;
    	char * value;
    } stringPair;
     
    int main(const int argc, const char * argv[])
    {
    char* list1;
    char *key1;
    stringPair * pPair1;
     
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
    strcpy (pPair1->key,key1);
    	strcpy (pPair1->value,list1);
    fprintf(stdout, "%s and %s\n",pPair1->key, pPair1->value);
    free(pPair1);
    }
    Donc je ne comprends pas pourquoi.

    Merci.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
    strcpy (pPair1->key,key1);
    strcpy (pPair1->value,list1);
    En faisant ça, tu alloues de la place pour la structure, mais tu n'alloues pas de place pour les zones pointées par les champs de la structure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pPair1=malloc(sizeof(stringPair));/*malloc(strlen(key1)+strlen(list1));*/
     
    pPair1->key = malloc(200);
    pPair1->value = malloc(200);
     
    strcpy (pPair1->key,key1);
    strcpy (pPair1->value,list1);
    marche beaucoup mieux.

  3. #3
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut
    Pourquoi 200 ?

    @+
    Rémi

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'était une taille tout à fait arbitraire, pour simplement illustrer le fait qu'il faut allouer de la mémoire et ainsi avoir un espace réservé pour y copier les chaines. J'aurais dû le préciser .
    Dans la réalité, il faudrait donner une taille justifiée et libérer la mémoire après utilisation.


    Je relis le code et je me rend compte de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    Les affectations à "" ne servent à rien, puisqu'elles sont immédiatement écrasées.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Oula, alors y'a pas mal de problemes. Mes commentaires dans le code. Pose des questions si tu ne comprends pas.

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct
    {
    	char * key;
    	char * value;
    } stringPair;
     
    int main(int argc, char * argv[]) /* pas de const dans le prototype de main */
    {
    char* list1;
    char *key1;
    stringPair * pPair1;
     
    /*********************
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    **********************/
    /* allocation de l'espace memoire pour key1 et list1 */
    list1 = key1 = pPair1 = NULL; /* initialisation a NULL pour la liberation en cas d'erreur */
     
    key1 = malloc (200); /* taille a definir */
    list1 = malloc (200); /* taille a definir */
    pPair1=malloc(sizeof(stringPair));
     
    /* verification */
    if (key1 == NULL  ||  list1 == NULL  ||  pPair1 == NULL)
    {
      fprintf (stderr, "Erreur d'allocation memoire\n");
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1), pPair1 = NULL; 
     return EXIT_FAILURE;
    }
     
    /* la memoire est allouee. On peut ecrire dedans */
    sprintf (key1, "test");
    sprintf (list1, "bonjour");
     
    /* on alloue le contenu de la structure */
    pPair1->key = pPair1->value = NULL;
     
    pPair1->key = malloc (300);
    ppair1->value = malloc (300);
    if (pPair1->key == NULL  || pPair1->value == NULL)
    {
      fprintf (stderr, "Erreur d'allocation memoire\n");
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1->key), pPair1->key = NULL; 
      free (pPair1->value), pPair1->value = NULL; 
      free (pPair1), pPair1 = NULL; 
      return EXIT_FAILURE;
    }
     
    /* on peut copier les donnees. Utiliser strncpy serait mieux */
    strcpy (pPair1->key, key1);
    strcpy (pPair1->value,list1);
     
    /* affichage */
    fprintf(stdout, "%s and %s\n",pPair1->key, pPair1->value);
     
    /* liberation memoire */
      free (key1), key1 = NULL;
      free (list1), list1 = NULL;
      free (pPair1->key), pPair1->key = NULL; 
      free (pPair1->value), pPair1->value = NULL; 
      free (pPair1), pPair1 = NULL; 
     
    /* fin */
      return EXIT_SUCCESS;
    }

    A changer dans ce code : utiliser snprintf, strncpy.

    Pourquoi utilises-tu de la memoire dynamique ? Pour l'exercice, ou bien il n'y a aucune raison, et tu pourrais utiliser de la memoire statique, ce qui serait beaucoup plus simple pour toi ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je relis le code et je me rend compte de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    key1="";
    key1="test";
    list1="";
    list1="bonjour";
    Les affectations à "" ne servent à rien, puisqu'elles sont immédiatement écrasées.
    Je pense que tu es fatigue : les chaines de caracteres ne se copient pas comme ca
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Euh.... Je sais que ça ne se copie pas comme ça !

    char *ptr = "developpez.com" crée un pointeur sur une chaine et comme la chaine est constante, cette chaine est dans la zone mémoire réservée aux constantes. Si a la suite, je fais ptr= "developpez.net", ptr pointe maintenant vers une nouvelle chaine constante, qui est à un autre endroit de la mémoire statique (à voir même si le compilateur n'est pas suffisamment malin pour ne garder que la seconde affectation dans le code cité à mon message précédent).

    Le code suivant est valide, non ? (en tout cas, ni MinGW ni Dr Memory ne me jettent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        char *ptr = "developpez.com";
        printf("%p : %s\n", ptr, ptr);
     
        ptr = "developpez.net";
        printf("%p : %s\n", ptr, ptr);
    }

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Le code suivant est valide, non ? (en tout cas, ni MinGW ni Dr Memory ne me jettent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        char *ptr = "developpez.com";
        printf("%p : %s\n", ptr, ptr);
     
        ptr = "developpez.net";
        printf("%p : %s\n", ptr, ptr);
    }
    Oui, nous sommes d'accord, ce code est valide :

    Dans ce code, tu crees un pointeur ptr que tu fais pointer sur un const char [15], ce que te confirme gcc ou clang si tu compiles avec l'option -Wwrite-strings :
    -Wwrite-strings
    When compiling C, give string constants the type const char[length] so that copying the address of one into a non-const char * pointer will get a warning; when compiling C++, warn about the deprecated conversion from string constants to char *. These warnings will help you find at compile time code that can try to write into a string constant, but only if you have been very careful about using const in declarations and prototypes. Otherwise, it will just be a nuisance; this is why we did not make -Wall request these warnings.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % clang  -Wwrite-strings test.c 
    test.c:7:11: warning: initializing 'char *' with an expression of type 'const char [15]' discards qualifiers
        char *ptr = "developpez.com";
              ^     ~~~~~~~~~~~~~~~~
    test.c:10:9: warning: assigning to 'char *' from 'const char [25]' discards qualifiers
        ptr = "developpez.net_plus_long";
            ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    2 warnings generated.
    C'est juste que dans son cas, je pense que le but est de manipuler des chaines de caracteres, et qu'il serait donc preferable de prendre de bonnes habitudes tout de suite (pour ne pas le voir revenir plus tard avec une copie de chaine de caractere avec =)developpez.com
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu m'as mis un -1 et m'a traité d'endormi alors que je ne disais (presque) pas de bêtise

    -Wwrite-strings pour se prémunir des gens qui voudraient utiliser un = au lieu d'un strcpy ,si je comprend bien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* la memoire est allouee. On peut ecrire dedans */
    sprintf (key1, "test");
    sprintf (list1, "bonjour");
    Pourquoi ne pas utiliser strcpy ?

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* la memoire est allouee. On peut ecrire dedans */
    sprintf (key1, "test");
    sprintf (list1, "bonjour");
    Pourquoi ne pas utiliser strcpy ?
    Encore un petit peu endormi ?

    Citation Envoyé par http://man.developpez.com/man3/printf.3.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int sprintf (char *str, const char *format, ...);
    - sprintf va servir à remplir une chaîne de caractère avec des données formatée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(monChar, "%s %d...%f", "toto", 5, 2.0);
    - strcpy va servir à copier le contenu d'une chaîne de caractère dans une autre.
    Donc si on veut juste faire une copie, on utilisera plutôt strcpy.

    @PO : Rajouter le 'n' : snprintf, strncpy permettra de s'assurer qu'on ne dépasse pas la taille allouée et ainsi on se protègera d'éventuels SEGFAULT.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Encore un petit peu endormi ?
    Bon hey ho !

    Je sais à quoi sert sprintf, merci, et justement dans ce cas, ce n'est pas franchement une chaine formatée, c'est une simple copie. Comme utiliser printf("%s", chaine) au lieu de puts(chaine), pas grand intérêt. Je cherchais une raison par rapport aux contraintes de l'option de compilation donnée par gangsoleil.

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je sais à quoi sert sprintf
    Je n'en doute pas, mais je préférai donner cette précision pour le PO ou d'éventuels lecteurs.


    Pour revenir à ta question, je n'avais pas vu que tu citais du code de gangsoleil qui voulait juste montrer les deux solutions :
    Citation Envoyé par gangsoleil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sprintf (key1, "test");
    sprintf (list1, "bonjour");
    //et
    strcpy (pPair1->key, key1);
    strcpy (pPair1->value,list1);
    Mais je pense que gangsoleil a eu un petit problème de copié-collé (d'où la raison de mon précédant post)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf (key1, "%s", "test");
    sprintf (list1, "%s", "bonjour");
    Il est vrai qu'on utilisera plutôt str(n)cpy mais je pense que gangsoleil voulait aussi lui montrer qu'on peut utiliser s(n)printf si jamais on a besoin d'une chaîne de caractère formatée.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je n'en doute pas
    Bon ça va alors ^^

    Mais je pense que gangsoleil a eu un petit problème de copié-collé
    Je ne pense pas. Tu écris quoi toi ? printf("Bonjour"); ou printf("%s", "bonjour"); ? ^^

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bon, les vacances ne me font pas que du bien

    Je me suis tout de même trouvé une petite excuse :
    Le f de printf et de scanf signifie formaté, quand on ne manipule pas des données formatée mais simplement une chaîne de caractère, on utilisera des fonctions plus rapide comme str(n)cpy, fgets, puts etc...
    Donc j'ai tellement peu l'habitude de voir un simple fprintf(char *, char *) que c'en est perturbant.

    Bon j'avais quand même fait un test pour ne pas dire de bêtises avant de poster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char c[4];
        char d[4] = "tot";
    
        sprintf(c, d);
        printf("%c",d);
    Je commence bien la journée

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Et après tu me demandes si je dors encore quand je propose d'utiliser strcpy

    Ca t'apprendra, on ne devrait pas avoir le droit d'être étudiant, en vacances et levé si tôt !

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Pourquoi ne pas utiliser strcpy ?
    l'avantage de s(n)printf, c'est que tu es certain que la chaine est terminee par un \0, ce qui n'est pas le cas de str(n)cpy.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    l'avantage de s(n)printf, c'est que tu es certain que la chaine est terminee par un \0, ce qui n'est pas le cas de str(n)cpy.
    On peut toujours faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char destination[taille];
    strncpy(destination, source, taille - 1);
    destination[taille - 1] = '\0';

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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