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 :

Probleme d'allocation avec un malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut Probleme d'allocation avec un malloc
    Je lis dans un fichier, ligne par ligne. Pas de probleme pour ça.
    Ensuite j'insere ces donne dans une structure.


    STRUCT **test;
    int nbtest;

    pour cela j'alloue test= STRUCT** malloc (sizeof(STRUCT))

    puis par la suite je vai realloue la memoire avec un realloc à nbtest+1 pour faire grandir mon tableau test, puis un malloc sur test[nbtest].

    Mon probleme etant que tout ce passe bien jusqu'a la 70 000 eme ligne. Et que j'en ais encore beaucoup de ligne à lire.

    Là il me met une erreur d'adresse mémoire, le probleme venant du malloc.

    Je voudrais savoir, si quelqu'un sait pourquoi une erreur memoire se produit alors que le schema execute est toujour le meme. Une boucle.

    Je ne peux pas mettre le code source pour des raisons professionnels car cela implique de mettre tout le code pour comprendre. Désolé.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Un dépassement de mémoire très certainement.
    Mais comme tu déclares un pointeur de pointeur vers ta structure, pourquoi ne pas faire un malloc (sizeof(STRUCT*)) ?
    Le pointeur prendra moins de place que ta structure.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par theshark85
    Je lis dans un fichier, ligne par ligne. Pas de probleme pour ça.
    Ensuite j'insere ces donne dans une structure.


    STRUCT **test;
    int nbtest;

    pour cela j'alloue test= STRUCT** malloc (sizeof(STRUCT))
    Ce code n'a aucun sens. Le type des éléments est STRUCT* et non STRUCT. de plus, tu n'en alloues qu'un... Je recommande l'écriture canonique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T * p = malloc (sizeof *p * n);
    Ce qui se traduit ici par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     STRUCT **test = malloc (sizeof *test * nbtest);
    Maintenant, on a un superbe trableau de nbtest pointeurs sur STRUCT non initialisés.
    puis par la suite je vai realloue la memoire avec un realloc à nbtest+1 pour faire grandir mon tableau test, puis un malloc sur test[nbtest].
    Ah ? Ben c'est mal parti avec un STRUCT ** ! Il fallait un STRUCT * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     STRUCT *test = malloc (sizeof *test * nbtest);
    Comme tu peux le voir, maintenance minimale ! (Suppression d'un '*').
    Mon probleme etant que tout ce passe bien jusqu'a la 70 000 eme ligne. Et que j'en ais encore beaucoup de ligne à lire.
    Ca se passe mal dès la première ligne... le comportement est indéfini.

    Que fais -tu pour tester la validité de la reallocation ?

    http://emmanuel-delahaye.developpez....es.htm#realloc

    Et puis, je te conseille de réduire le nombre de realloc() en jouant sur une croissance exponentielle (par doublage). C'est beaucoup plus performant.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    En relisant je me suis aperçut que j'avais oublié une étoile.
    Et j'alloue bien ainsi : test= STRUCT** malloc (sizeof(STRUCT*))

    Sinon pour le realloc, pourquoi en exponentielle, le doublage a partir d'un moment sera trop important genre quand j'arriverais à la 60 000 000 ligne de fichier je vais pas reallouer 120 000 000!!!!

    Et si j'ai un STRUCT **test, c'est obligatoire pour mes traitements.

    Pour tester ma reallocation, lecture des adresses.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Citation Envoyé par theshark85
    Sinon pour le realloc, pourquoi en exponentielle, le doublage a partir d'un moment sera trop important genre quand j'arriverais à la 60 000 000 ligne de fichier je vais pas reallouer 120 000 000!!!!
    C'est une technique standard.
    Il y a des variantes, on peut agrandir la capacité de 10% plutôt que la doubler.

    En tout cas, réallouer 1 item de plus à chaque fois, c'est ce qu'on peut faire de pire pour les performances.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut
    si tu veut faire un double pointeur pour un tableau de structure a 2 dimension,

    alloue comme ceci :

    test= (STRUCT**) malloc (sizeof(STRUCT*)*n);

    n étant le nombre d'élément dans ton tableau. La tu aura un tableau de n pointeur ver des structure mais qui pointe sur rien du tout, tu doit allouer ensuite pour chaque élément dans un boucle de 0 a n-1 fois :

    test[i] = (STRUCT*)malloc(sizeof(STRUCT));

    Si c'est un tableau simple que tu veut faire :
    test = (STRUCT*)malloc(sizeof(STRUCT)*n); suffit

    voila.


    ++

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par deck_bsd
    si tu veut faire un double pointeur pour un tableau de structure a 2 dimension,

    alloue comme ceci :

    test= (STRUCT**) malloc (sizeof(STRUCT*)*n);

    n étant le nombre d'élément dans ton tableau. La tu aura un tableau de n pointeur ver des structure mais qui pointe sur rien du tout, tu doit allouer ensuite pour chaque élément dans un boucle de 0 a n-1 fois :

    test[i] = (STRUCT*)malloc(sizeof(STRUCT));

    Si c'est un tableau simple que tu veut faire :
    test = (STRUCT*)malloc(sizeof(STRUCT)*n); suffit

    voila.


    ++

    Le cast est inutile en C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *test = malloc(50);
    Il peut d'ailleurs cacher l'oubli d'inclusion de stdlib.h

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par deck_bsd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test= (STRUCT**) malloc (sizeof(STRUCT*)*n);
     
    test[i] = (STRUCT*)malloc(sizeof(STRUCT));
    Une façon compliquée d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdlib.h>
     
       STRUCT **test= malloc (sizeof *test * n);
     
       test[i] = malloc (sizeof *test[i]);
    Ne pas oublier de tester si l'allocation a réussi et de libérer quand on n'utilise plus.

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

Discussions similaires

  1. malloc probleme d'allocation
    Par SPACHFR dans le forum C
    Réponses: 1
    Dernier message: 27/04/2012, 17h48
  2. Allocation avec sbrk, probleme sur les void*
    Par flov91 dans le forum Débuter
    Réponses: 3
    Dernier message: 05/02/2009, 12h35
  3. probleme avec les malloc snprintf
    Par pinto_armindo dans le forum Réseau
    Réponses: 8
    Dernier message: 30/10/2007, 18h08
  4. Probleme d'allocation malloc free
    Par cmoibal dans le forum Linux
    Réponses: 1
    Dernier message: 23/05/2007, 14h21
  5. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42

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