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 à l'essai
    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
    Points : 14
    Points
    14
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    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.

  3. #3
    Membre à l'essai
    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
    Points : 14
    Points
    14
    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