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


Sujet :

C

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 40
    Points : 25
    Points
    25
    Par défaut Problème de mémoire
    Bonjour,

    J'ai codé 2 fonctions. L'une (lectureFichier) qui lit dans un fichier et stocke n caractères dans un tableau pour retourner ce tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE *fichier = NULL;
            fichier = fopen(fichierATester, "rb");
     
    	unsigned char *lecture = NULL;
     
    	lecture = malloc(n*sizeof(unsigned char));
    La seconde appelle cette 1ere fonction pour en manipuler le tableau renvoyé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *lecture = lectureFichier(<paramètres>);
    Lorsque j'appelle lectureFichier dans une boucle, pas de souci, celle-ci s'exécute.

    Lorsque j'appelle la 2nde, elle "bloque" à 2 itérations et j'ai l'erreur suivante:

    L'instruction à "0x......." emploie l'adresse mémoire "0x01010101". La mémoire ne peut pas être "read".
    Je ne vois pas d'où peut venir le problème puisque l'allocation se passe très bien dans lectureFichier...

    Des idées?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Tu accedes a une zone memoire sans y avoir le droit. Sans plus de code, et sans boule de cristale, impossible de te repondre.

    Essaie de reduire ton code au minimum pour reproduire ton probleme, et poste-le ici.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Ok.

    Voilà ma fonction "condensée" lectureFichier:

    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
    unsigned char* lectureFichier(char fichierATester[], int n)
    {
        FILE *fichier = NULL;
        fichier = fopen(fichierATester, "rb");
     
        int	i = 0;
     
    	unsigned char *lecture = NULL;
    	lecture = malloc(n*sizeof(unsigned char));
    	if (lecture == NULL) // On vérifie si l'allocation a marché
        {
            exit(0);
        }
     
    	size_t nbElementsLus = 0;
     
    	for (i=0; i<n; i++)
    	{
    	    nbElementsLus = fread(&lecture[i],sizeof(unsigned char),1,fichier);
            if (nbElementsLus == 0)
            {
            //La fin de fichier a été prématurément atteinte
            exit(0);
            }
        }
    	fclose(fichier);
    	return lecture;
    }

    Voici la fonction qui l'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    double fonction2(char fichierATester[], int n)
    {    
        unsigned char *lecture = lectureFichier(fichierATester, n);
     
        int	i = 0;
        double sum = 0.0;
     
    	for (i=0; i<n; i++) 
    	{
    	    sum = sum + 2*lecture[i]-1; 
        }
        free(lecture);
    	return sum;
    }
    Puis dans le main, si j'appelle plusieurs fois (dans une boucle for) lectureFichier, pas de souci. Mais si j'appelle plusieurs fois fonction2, erreur comme détaillée précédemment.

    A noter que si j'appelle ma fonction dans une boucle c'est pour lire à différents endroits du fichier, mais je ne rentre pas dans les détails ce n'est pas pertinent ici je crois.

    MERCI!

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Le seul point pouvant poser problème que je constate est que tu ne vérifies pas l'ouverture correcte du fichier dans lectureFichier(). Si elle échoue, le programme plante sur le fread().

    Si les ouvertures de fichiers sont correctes, le problème est ailleurs dans le code.

    De toute façon, du point de vue des traitements d'erreurs, ce code est complètement à revoir :
    - ouverture du fichier non vérifiée comme déjà mentionné
    - si le malloc échoue, le fichier reste ouvert (si il existe)
    - si on atteint la fin de fichier prématurément ou en cas d'erreur de lecture, le fichier reste ouvert et l'allocation dynamique n'est pas récupérée.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 40
    Points : 25
    Points
    25
    Par défaut
    Merci diogene, le problème venait effectivement de la mauvaise gestion des erreurs!

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

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. 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
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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