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 :

Problème de mémoire avec des doubles pointeurs


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Par défaut Problème de mémoire avec des doubles pointeurs
    Bonjour,
    J'ai un problème d'allocation de mémoire que je n'arrive pas à résoudre pour ma variable string_p.
    Je pense que mon realloc dans la fonction lecture() est mauvais, mais je ne vois pas comment faire.

    Merci d'avance.

    Code c : 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
     
    int lecture( char *, char **, FILE * );
     
    int main(int argc, char ** argv)
    {
     
    	FILE * stream_p = NULL;
    	char * string_p = NULL;		// Mot P.
    	unsigned int m = 0;			// Taille du mot P.
     
     
    	m = lecture( "P", &string_p, stream_p );
     
    	return EXIT_SUCCESS;
    }
     
    int
    lecture( char * nom_fichier, char** string, FILE * stream )
    {
    	int c;
    	unsigned int taille_mot = 0;
     
     	// ouverture en lecture du fichier
    	stream = fopen( nom_fichier, "r" ) ;
     
    	if(stream == NULL )
    	{
    		printf( "Impossible d'ouvrir le fichier %s \n", nom_fichier );
    		exit( EXIT_FAILURE );
     	}
     	printf( ".............. Ouverture du fichier %s \n", nom_fichier );
     
    	// lecture du fichier
    	string[0] = malloc(sizeof(char*)*taille_mot);
     
    	// attention la case 0 n'est pas utilisé. 
    	while((c = fgetc(stream)) != EOF)
    	{
    		// Ignore les retours chariots
    		if(c != '\n')
    		{
    			string[taille_mot + 1] = (char*)realloc(string[taille_mot + 1],sizeof(char) * ( taille_mot + 1 ) );
    			(*string)[taille_mot + 1] = c ;
    			printf("%c",(*string)[taille_mot+1]);
    			taille_mot++ ;
    		}
    	}
    		printf("\n");
     
    	// fermeture du fichier
    	if( fclose(stream) == EOF )
    	{
    		printf( "\nProbleme de fermeture du fichier\n" );
    		exit( EXIT_FAILURE ) ;
    	}
    	printf( ".............. Fermeture du fichier\n\n" );
     
    	return taille_mot ;
    }

  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
    1. Pour commencer, pourquoi passes-tu le stream en paramètre? Il devrait être une variable locale.
    2. Ensuite, le premier paramètre de lecture devrait être de type const char*, vu que la fonction ne cherche pas à modifier la chaîne de caractères pointée.
    3. Pour finir, cette ligne est fausse:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      		string[taille_mot + 1] = (char*)realloc(string[taille_mot + 1],sizeof(char) * ( taille_mot + 1 ) );

    Tu devrais te faire une fonction de réallocation dédiée, ne servant qu'à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /*Retourne 1 si succès, 0 si erreur*/
    int realloc_char(char**ppChars, size_t numberOfElements)
    {
    	/*Note: Pas besoin de cast tant qu'on utilise un compilateur C*/
    	char * pTmp = realloc(*ppChars, numberOfElements * sizeof(*pTmp));
    	if(pTmp != NULL)
    	{
    		*ppChars = pTmp;
    		return 1;
    	}
    	else
    		return 0;
    }
    Autre idée pour simplifier ta fonction de lecture: Travailler sur une variable intermédiaire, plutôt que d'utiliser tout le temps le double pointeur; ne l'affecter qu'à la fin de la fonction.
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Par défaut
    Merci pour tous tes conseilles de programmation .

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

Discussions similaires

  1. problème de fonction avec des pointeurs
    Par bl4cksky dans le forum Débuter
    Réponses: 16
    Dernier message: 09/09/2013, 12h28
  2. Problème de mémoire avec des Bitmap
    Par Ryu2000 dans le forum Android
    Réponses: 11
    Dernier message: 06/04/2012, 11h34
  3. Problème en mémoire avec des tableaux
    Par dword2add dans le forum C++
    Réponses: 3
    Dernier message: 11/11/2007, 13h36
  4. problème char-actéristique avec des pointeurs
    Par Antigonos Ier Gonatas dans le forum C
    Réponses: 11
    Dernier message: 16/04/2007, 21h22
  5. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11

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