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

  1. #21
    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
    Une corruption de ce genre est généralement très difficile à retrouver. Mais c'est généralement du à un dépassement de buffer, alors si tu as des outils pour les dépister, n'hésite pas, sinon il ne te reste plus qu'à passer ton code au peigne fin...
    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.

  2. #22
    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
    quel genre d'outil on utilise pour "depister" ce genre de probleme?

  3. #23
    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
    valgrind, je crois bien (mais je n'en suis pas sûr) : Je n'utilise pas les outils de débogage de GCC depuis que j'ai comparé Dev-C++ et Visual...
    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.

  4. #24
    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 merci pour tes réponses, je poste reposte des que j'ai resolu le probleme...

  5. #25
    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

  6. #26
    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...

  7. #27
    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

  8. #28
    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]);
    }

  9. #29
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par booby
    quel genre d'outil on utilise pour "depister" ce genre de probleme?
    Valgrind si tu est sous Linux est un bon choix, il permet entre autre de détecter les memory leak, il vérifie et suit chaque malloc/calloc/realloc/free !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #30
    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
    Et le code de GetCoord ?
    Et les déclarations des variables globales?

    Jc

  11. #31
    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.

    en variable globale:
    pour getcoord:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    float **GetCoord(char ***M, int *DimTab){
    	float **coord;
    	int i, j;
     
    	coord = f2float(DimTab[0]-1,DimTab[1]-1);
    	for (i = 1; i < DimTab[0]; i++){
    		for (j = 1; j < DimTab[1]; j++) {
    			coord[i-1][j-1] = atof(M[i][j]);
    		}
    	}
    	return coord;
    }

  12. #32
    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
    Citation Envoyé par booby
    ok.

    en variable globale:
    Et la zone mémoire allouée pour Size et les valeurs que tu y mets?

    pour getcoord:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    float **GetCoord(char ***M, int *DimTab){
    	float **coord;
    	int i, j;
     
    	coord = f2float(DimTab[0]-1,DimTab[1]-1);
    	for (i = 1; i < DimTab[0]; i++){
    		for (j = 1; j < DimTab[1]; j++) {
    			coord[i-1][j-1] = atof(M[i][j]);
    		}
    	}
    	return coord;
    }
    Donc je confirme, ta façon d'allouer ton tableau C provoque une fuite de mémoire. Ensuite, on utilise pas atof mais strtod.

    Jc

  13. #33
    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, merci de te pencher sur mon problème. Serait-il possible, maintenant que je sais mon mes allocations provoquent des fuites de mémoire, de me donner un tout petit exemple d'allocation correctement faite?

  14. #34
    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
    de me donner un tout petit exemple d'allocation correctement faite?
    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
    int **f2int(int a, int b)
    {
         int i;
     
         int **myPointer = malloc (a * sizeof(int*));
     
         if(myPointer==NULL) {
           return NULL;
         }
     
         for (i=0; i<a; i++) {
             myPointer[i] = malloc (b * sizeof(int));
    	 if(myPointer[i]==NULL) {
    	    i--;
     	    while(i>=0) {
    	      free(myPointer[i]);
    	    }
    	    free(myPointer);
    	    return NULL;
    	 }
         }
         return myPointer;
    }

    Et pareil pour f2float... Par contre, je pense que t'auras encore un problème pour ta déclaration de Size... Ce serait plus simple de l'intégrer dans le main comme tableau statique du main...

    Jc

  15. #35
    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, merci pour ta réponse, j'essaie ça de suite.

    Citation Envoyé par fearyourself
    Par contre, je pense que t'auras encore un problème pour ta déclaration de Size... Ce serait plus simple de l'intégrer dans le main comme tableau statique du main...
    Ok je ferai ça.

  16. #36
    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
    apparemment ça MARCHE!!! un grand merci @ tous!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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