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 :

malloc et segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut malloc et segmentation fault
    Bonjour à tous,

    je code (ou plutot debugge) en ce moment sur un petit programme de calcul sur des matrices:
    Je pars d'un tableau de flottants à deux dimensions (pouvant atteindre 10000 * 10000), le remplissage de ce tableau se passe tres bien.
    La deuxième étape consiste à convertir les valeurs de ce tableau en 0 si on celle-ci dépasse un seuil donné (0.9521 par exemple) en 1 sinon.
    Je ne dois en aucun cas modifier le tableau de flottant, car la conversion en 0 ou 1 intervient au sein d'un boucle avec incrementation du seuil à chaque tour.
    Je n'ai pas d'erreur à la compilation (gcc sous red hat) mais une segmentation fault qui arrive (la plupart du temps) au moment du malloc pour le tableau d'entier. Le plus bizarre, c'est que mon programme tourne pour des petites instances (dimension du tableau environ 10*10) mais seg fault pour les dimension plus importantes (c'est ennuyeux sachant que ça doit tourner sur du 10000 * 10000).

    ci joint les morceaux de codes qui me posent probleme:

    l'appel de mes fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (int argc, char *argv[]){
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    	Cos = CosCompute(C, Size);
    	C = deletePointer2float(C, Size[0], Size[1]);
    	printMCos(NVecteurs, Cos, Size);	
    	Madj = f2int(Size[0], Size[0]);
    	Madj = MadjCreate(Cos, Size, SEUIL);
    	Madj = deletePointer2int(Madj, Size[0], Size[0]);
    	return 0;
    }
    fonction d'allocation de memoire pour mes tableaux d'entier (celle pour le tableau de flottant est identique mis à part le cast en float)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int **f2int(int a, int b){
         int i;
     
         int **myPointer = (int **)malloc (a * sizeof(int*));
         for (i=0; i<a; i++)
             myPointer[i] = (int *)malloc (b * sizeof(int));
         return myPointer;
    }
    fonction de liberation de la memoire alloué pour mes tableaux d'entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char **deletePointer2(char **myPointer, int a, int b){
         int i;
     
         for (i=0; i < a; i++)
         {
             free(myPointer[i]);
         }         
         free (myPointer);
         myPointer = NULL;
         return myPointer;
    }
    fonction de conversion du tableau de flottant en entier (0/1):

    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* la seg fault a lieu ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }
    merci à tout ceux qui pourront se pencher sur la question.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu as essayé en vérifiant les retours de malloc() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    oui j'ai essayé des choses du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(myPointer[i] = (int *)malloc (b * sizeof(int)))) erreur();
    mais seg fault et ça n'affiche pas le message d'erreur...

  4. #4
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int **f2int(int a, int b){
         int i;
         
         int **myPointer = (int **)malloc (a * sizeof(int*));
         for (i=0; i<a; i++)
             myPointer[i] = (int *)malloc (b * sizeof(int));
         return myPointer;
    }
    Je ne crois pas que le transtypage soit obligatoire.


    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* la seg fault a lieu ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }
    Par contre la cette dernière ligne en rouge ne sert à rien si ce n'est qu'a faire jolie. Après un return, on sort de la fonction donc il ait peu de chance que ta dernière instruction soit executée

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    je viens de tester les modifications, malheureusement la seg fault est toujours là.
    Par contre je vais apporter une correction à mon premier post:
    l'erreur apparait en fait lors du premier appel de f2int:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (int argc, char *argv[]){
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    	Cos = CosCompute(C, Size);
    	C = deletePointer2float(C, Size[0], Size[1]);
    	printMCos(NVecteurs, Cos, Size);	
    	Madj = f2int(Size[0], Size[0]);/* ici */
    	Madj = MadjCreate(Cos, Size, SEUIL);
    	Madj = deletePointer2int(Madj, Size[0], Size[0]);
    	return 0;
    }
    ça n'est que lorsque je mets cette ligne en commentaire que la faute apparait à l'appel suivant de f2int:

    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
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);/* ici */
    
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }

  6. #6
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    les erreurs de segmentation à l'allocation même c'est à dire pendant le malloc ne sont pas forcément du à l'instruction mais plutot au code antécédent.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À mon avis, ce n'est pas pendant les mallocs, c'est au retour d'un malloc() de la boucle: Le pointeur (sans doute nul) est affecté au pointeur nul retourné par le malloc() hors de la boucle ---> segfault.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    En fait j'ai deja eu un problème similaire je réallouais avec une taille inférieur et l'erreur de segmentation venait dans le malloc. Biensur le malloc ne pouvait rien retourné puisque ca se passer dedans. Donc je pense que tu as surement une erreur de segmentation avant mais que c'est lors du malloc que tu la vois

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    les erreurs de segmentation à l'allocation même c'est à dire pendant le malloc ne sont pas forcément du à l'instruction mais plutot au code antécédent.
    j'ai verifié tout le code antecedant, deroulé toutes les variables sur grandes et petites instances... il n'y a pas de probleme, je pense...

    À mon avis, ce n'est pas pendant les mallocs, c'est au retour d'un malloc() de la boucle: Le pointeur (sans doute nul) est affecté au pointeur nul retourné par le malloc() hors de la boucle ---> segfault.
    les test du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(myPointer[i] = (int *)malloc (b * sizeof(int)))) erreur();
    ne sont pas censés prevenir ce genre de probleme ? car quand je teste le malloc, je n'ai le message d'erreur mais, la seg fault directement...

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il faut se poser la question myPointer[i] est-il un pointeur valide ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    C'est le genre de truc qu'un comilateur bien réglé signale tout de suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    Il faut absolument tester le retour de malloc (10000*10000*sizeof double ça fait quand même beaucoup !)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Donc, une grosse mémoire leakée, et ce dans une boucle.
    Pour moi, il y n'y a pas de doute : Les malloc() finissent par échouer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ce bout de code ne m'inspire pas confiance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    Tu alloues un tableau et après tu perds le pointeur... Pas une bonne idée...

    Jc

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    je perds le pointeur? ben si c'est ça c'est surement de là que vient mon erreur... scusez mes modestes connaissances, mais tu me conseilles de faire comment?
    parce que si j'alloue pas avec "f2float" j'ai un warning à la compilation: "return adress of a local variable"....
    en plus ça expliquerai pourquoi des fois ça plante pendant un free...

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    En regardant de plus prêt, je vois que tu utilises un pointeur global... Ce n'est pas non très conseillé...

    Donc le problème ne vient pas de là si tu ne change jamais la valeur de la variable globale C et qu'à la fin de la fonction tu retournes C (mais alors où est l'intérêt?)

    Le plus simple serait d'avoir le code de chacune de tes fonctions... Serait-ce possible?

    Jc

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    ok. Voici les fonctions que j'utilise:


    l'appel de mes fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (int argc, char *argv[]){
            C = f2float(Size[0], Size[1]);
    	C = GetCoord(Mtab, Size);
    	Cos = CosCompute(C, Size);
    	C = deletePointer2float(C, Size[0], Size[1]);
    	printMCos(NVecteurs, Cos, Size);	
    	Madj = f2int(Size[0], Size[0]);
    	Madj = MadjCreate(Cos, Size, SEUIL);
    	Madj = deletePointer2int(Madj, Size[0], Size[0]);
    	return 0;
    }
    fonction d'allocation de memoire pour mes tableaux d'entier (celle pour le tableau de flottant est identique mis à part le cast en float)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int **f2int(int a, int b){
         int i;
     
         int **myPointer = (int **)malloc (a * sizeof(int*));
         for (i=0; i<a; i++)
             myPointer[i] = (int *)malloc (b * sizeof(int));
         return myPointer;
    }
    fonction CosCompute appelle GetNorm et GetSProduct

    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
    float GetNorm(float *Coord, int *Dimension){
    	float result = 0;
    	float temp = 0;
    	int i = 0;
    	int siz = Dimension[1];
     
    	for (i = 0; i < siz-1; i++)
    		temp = temp + (Coord[i]*Coord[i]);	
    	result = sqrt(temp);
    	return result;	
    }
     
    float GetSProduct(float *V1, float *V2, int *Dimension){
    	int i = 0;
    	float result = 0;
    	int siz = Dimension[1];
     
    	for (i = 0; i < siz-1; i++){
    		printf(" i = %d V1 = %f V2 = %f\n", i, V1[i], V2[i]);*/
    		result = result + (V1[i]*V2[i]);
    	}
    	return result;	
    }
     
    float **CosCompute(float **Coord, int *Dimension){
    	int line = Dimension[0]-1;
    	int i,j;
    	float Scalaire;
    	float NormV[line];
    	float **Cosinus;
    	Cosinus = f2float(Dimension[0],Dimension[0]);
    	for (i = 0; i < line; i++){
    		NormV[i] = GetNorm(Coord[i], Dimension);
    	}
     
    	for (i = 0; i < line; i++){
    		for (j = i+1; j < line; j++){
    			Scalaire = GetSProduct(Coord[i], Coord[j], Dimension);
    			Cosinus[i][j] = (Scalaire)/((NormV[i])*(NormV[j]));
    			Cosinus[j][i] = Cosinus[i][j];
    		}
    	}
    	return Cosinus;
    }
    fonction de liberation de la memoire alloué pour mes tableaux de flottants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char **deletePointer2float(float **myPointer, int a, int b){
         int i;
     
         for (i=0; i < a; i++)
         {
             free(myPointer[i]);
         }         
         free (myPointer);
         myPointer = NULL;
         return myPointer;
    }
    fonction de conversion du tableau de flottants en entier (0/1) en fonction de SEUIL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int **MadjCreate(float **Cos, int *Size, float SEUIL){
    	int **TEMP;
    	int i, j;
    	TEMP = f2int(Size[0], Size[0]);
    	for(i = 0; i < Size[0]-1; i++){
    		for(j = 0; j < i; j++){
    			if (Cos[i][j] <= SEUIL)	TEMP[i][j] = 1;
    			else TEMP[i][j] = 0;
    			TEMP[j][i] = TEMP[i][j];
    		}
    	}
    	return TEMP;
    	TEMP = deletePointer2int(TEMP, Size[0], Size[0]);
    }

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

Discussions similaires

  1. Segmentation fault après malloc
    Par Nykoo dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 16/12/2007, 17h08
  2. Malloc et segmentation fault sous Linux
    Par Del4king dans le forum C
    Réponses: 16
    Dernier message: 15/11/2006, 17h10
  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