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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    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 sénior
    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
    Points : 20 985
    Points
    20 985
    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 régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    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 confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    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 régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    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 éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 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 sénior
    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
    Points : 20 985
    Points
    20 985
    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.

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Points : 115
    Points
    115
    Par défaut
    J'ai résolu mon probléme, c'était un char que j'avais oublié de déclarer en pointeur du coup prenait trop d'espace memoire, et si on multiplie 1000 * 7 000 000 ça a beau swap, ben ça marchera pas.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Emmanuel Delahaye : compliqué mais cela fonctionne quand mm. Oui il faut évidement tester si l'alloc c'est bien passée et faire un free a la fin, mais bon ca c'est a lui de le faire. j'aidai juste lol

  11. #11
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par deck_bsd
    Emmanuel Delahaye : compliqué mais cela fonctionne quand mm.
    La question n'est pas là. Comme il t'a été signalé, le cast peut masquer l'oubli de <stdlib.h>, et ce de la pire des manières. (transtypage à risque, sur un pointeur en plus !)

    http://emmanuel-delahaye.developpez....tes.htm#malloc

    Oui il faut évidement tester si l'alloc c'est bien passée et faire un free a la fin, mais bon ca c'est a lui de le faire. j'aidai juste lol
    Il faut considérer que le débutant ne sais pas. Ne pas hésiter à être précis et complet.

    à part ça, continue, tu as l'air de maitriser le sujet. C'est bien.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    La question n'est pas là. Comme il t'a été signalé, le cast peut masquer l'oubli de <stdlib.h>, et ce de la pire des manières. (transtypage à risque, sur un pointeur en plus !)
    Oui je suis daccord, mais bon c'est une question d'habitude, j'ai tjrs fait comme ça et je sais qu'il faut inclure stdlib.h. Enfin chacun ça manière de faire

    Merci pour l'encouragement

+ 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