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 :

Allocation/Réallocation mémoire sur tableaux de structures


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut Allocation/Réallocation mémoire sur tableaux de structures
    Bonjour,
    j'aurais besoin de votre aide au sujet d'une fonction que je lance en boucle et qui dans le premier cas me provoque des "Segmentation fault" dans certains cas ; cela apparaît toujours si je ne mets pas la variable MALLOC_CHECK_ à 0, et parfois si je la mets à 0.
    Je soupçonne des fuites mémoire ("memory leak") et le problème se situe au niveau de l'allocation mémoire (fonction realloc() ci-dessous). Si je lance mon programme avec valgrind, il marche à tous les coups (avec MALLOC_CHECK_ à 0).
    J'ai des "memory leak" apparemment.

    Voici le code de la 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
    int remplir_tab_nom_gros_fichier(char *nom_fic,St_fichier **tableau_fichier,int arch_status,int nbre_champ_A2)
    {
        St_fichier *tab_fichier;
        if (nbre_champ_A2 >0)
        {
            fprintf(stdout,"nbre_champ_A2=%d\n",nbre_champ_A2);
            if ( (*tableau_fichier = (St_fichier *)realloc(*tableau_fichier,sizeof(St_fichier)*((nbre_champ_A2) + 1))) == NULL)
            { 
                fprintf(stderr,"Pb reallocation memoire tab_tampon dans la fonction 'remplir_tab_gros_fichier()'\n");
                return(0);
            }
        }
        tab_fichier= *tableau_fichier;
        strcpy(tab_fichier[nbre_champ_A2].nom_fic,nom_fic);
        tab_fichier[nbre_champ_A2].arch_status = arch_status;  
        return(1);
    }
    Cette fonction est utilisée dans une boucle d'un programme (qui est trop volumineux pour être mis ici).

    1ere question : pourquoi ça plante?

    Ensuite, si je réécris cette fonction de la manière suivante :

    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
    int remplir_tab_nom_gros_fichier(char *nom_fic,St_fichier **tableau_fichier,int arch_status,int nbre_champ_A2)
    {
    	St_fichier *tab_fichier;
    	St_fichier *ptemp=NULL;
    	if (nbre_champ_A2 >0)
    	{
    		ptemp = (St_fichier *) malloc(sizeof(St_fichier)*((nbre_champ_A2) + 1));
    		if (ptemp==NULL)
    		{
    			fprintf(stderr,"Pb reallocation memoire dans la fonction 'remplir_tab_gros_fichier()'\n");
    			free(ptemp);
    			return(0);
    		}
    		else *tableau_fichier=ptemp;
    	}
    	tab_fichier = *tableau_fichier;
    	strcpy(tab_fichier[nbre_champ_A2].nom_fic,nom_fic);
    	tab_fichier[nbre_champ_A2].arch_status = arch_status;
    	return(1);
    }
    Je n'ai plus de plantage, en revanche, ce qui me chagrine c'est que j'alloue de la mémoire (donc pas de réallocation) et j'ai l'impression que je ne libère rien (quoi libérer et où?), et donc j'utilise beaucoup de mémoire au final.
    Bref je préfèrerais utiliser le realloc() mais j'ai tout essayé et impossible que ça ne plante pas.

    Merci pour votre aide
    Y.

  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 ne crois pas possible de répondre si on ne sait pas comment a été construit initialement le tableau invoqué dans le realloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            if ( (*tableau_fichier = (St_fichier *)realloc(*tableau_fichier,sizeof(St_fichier)*((nbre_champ_A2) + 1))) == NULL)
    Il serait utile aussi d'avoir la définition de St_fichier.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Salut,
    As tu bien aloué la mémoire de ta matrice **tableau_fichier ?
    Car là tu aloué la mémoire de la ligne mais pas des colonnes ?
    tu a sans doute tableau_fichier = null.

    a+;

  4. #4
    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 yoyostras Voir le message
    1ere question : pourquoi ça plante?
    Parce que tu as inversé le principe de mise dans une variable temporaire...:


    Et de toutes façons ce ne serait pas la bonne manière d'écrire..

    Et d'autre part pourquoi ne pas incrémenter le nombre dans la routine ??


    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
    int remplir_tab_nom_gros_fichier(char *nom_fic,St_fichier **tableau_fichier,int arch_status,int *nbre_champ_A2)
    {
        St_fichier *tab_fichier=NULL;
     
        if ( *nbre_champ_A2 < 0 )
           *nbre_champ_A2 = 0
    
       fprintf(stdout,"nbre_champ_A2=%d\n",*nbre_champ_A2);
        if ( (tab_fichier = (St_fichier *)realloc(*tableau_fichier,sizeof(St_fichier)*((*nbre_champ_A2) + 1))) == NULL)
            { 
                fprintf(stderr,"Pb reallocation memoire tab_tampon dans la fonction 'remplir_tab_gros_fichier()'\n");
                return(0);
            }
        else
            {
               *tableau_fichier= tab_fichier;
               strcpy((*tableau_fichier)[*nbre_champ_A2].nom_fic,nom_fic);
               (*tableau_fichier)[*nbre_champ_A2].arch_status = arch_status;  
    
              *nbre_champ_A2 = *nbre_champ_A2 + 1 ;
    
              return(1);
            }
    }

Discussions similaires

  1. pointeur sur Tableaux de structures
    Par Linu6 dans le forum C
    Réponses: 10
    Dernier message: 31/12/2007, 14h29
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. Question existentielle sur allocation de mémoire
    Par keepmeahug dans le forum C++
    Réponses: 6
    Dernier message: 03/05/2007, 12h08
  4. Question sur l'allocation de mémoire
    Par Fonzy007 dans le forum Linux
    Réponses: 8
    Dernier message: 26/12/2006, 09h29
  5. Allocation et réallocation dynamique de tableaux
    Par petitmic dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 14h59

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