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 :

[MALLOC] erreur de segmentation incomprise


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut [MALLOC] erreur de segmentation incomprise
    Bonsoir tout le monde

    Cela fait 1h que je tourne autour du pot.
    J'ai un programme à faire qui copie des BMP en le lisant entièrement, octet par octet, et qui l'écris dans un nouveau fichier.

    J'ai une fonction allouer_pixel qui alloue de la mémoire pour copier les octets de l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned char* allouer_pixels(entete_bmp *entete){
        unsigned char * tab;
        printf("taille des données image : %d \n", entete->bitmap.taille_donnees_image);
        tab = (unsigned char *)malloc(entete->bitmap.taille_donnees_image);
        printf("Allouement effectué");
        return tab;
    }
    Le premier printf me sert à vérifier que la taille est bonne (ce qui est le cas).
    Mais pas moyen d'allouer la mémoire (que ce soit avec ou sans cast).
    C'est assez énervant de bloquer sur un truc pareil >.<
    Je suis sûr que c'est une erreur vraiment bète en plus =/

    Merci d'avance

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je pense qu'il serait de bon ton de verifier le pointeur et d'afficher un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned char* allouer_pixels(entete_bmp *entete)
    {
        unsigned char *tab = (unsigned char *)malloc(entete->bitmap.taille_donnees_image);
        if (tab == NULL)
            perror("Echec lors de l'appel a malloc dans la fonction allouer_pixels ");
        printf("Allouement effectué");
        return tab;
    }

    De maniere general, toujours verifié l'integrité de ses pointeurs.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Le perror ne s'affiche même pas.
    J'ai essayé de mettre directement un int dans le malloc mais ca ne change rien.

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Si le perror ne s'affiche pas, c'est que le malloc c'est bien passer. Je te conseille de regarder autre part.

    Sinon, post des morceaux de code pour qu'on puisse situer l'erreur, car c'est dur de te dire comme cela.

    Ah oui, entete->bitmap.taille_donnees_image doit etre de type unsigned char, une piste peut etre ? (mais ca m'etonnerai vu que le perror ne s'affiche pas)

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Link14 Voir le message
    Bonsoir tout le monde

    Cela fait 1h que je tourne autour du pot.
    J'ai un programme à faire qui copie des BMP en le lisant entièrement, octet par octet, et qui l'écris dans un nouveau fichier.

    J'ai une fonction allouer_pixel qui alloue de la mémoire pour copier les octets de l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned char* allouer_pixels(entete_bmp *entete){
        unsigned char * tab;
        printf("taille des données image : %d \n", entete->bitmap.taille_donnees_image);
        tab = (unsigned char *)malloc(entete->bitmap.taille_donnees_image);
        printf("Allouement effectué");
        return tab;
    }
    Le premier printf me sert à vérifier que la taille est bonne (ce qui est le cas).
    Mais pas moyen d'allouer la mémoire (que ce soit avec ou sans cast).
    C'est assez énervant de bloquer sur un truc pareil >.<
    Je suis sûr que c'est une erreur vraiment bète en plus =/

    Merci d'avance
    le fait de ne pas avoir mis de "\n" à la fin de "Allouement effectué" fait que stdout n'est pas flushé immédiatement…

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    le fait de ne pas avoir mis de "\n" à la fin de "Allouement effectué" fait que stdout n'est pas flushé immédiatement…
    Honnetement, je ne pense pas que l'erreur vienne d'ici. Il met arrivé plusieurs fois de ne pas mettre '\n' a la fin d'un printf sans pour autant que cela bloque mon affichage.

    En fait, tout est trop vague. Existe t'il reelement une erreur ? Ou bien est ce juste que le code fait bien ce qu'on lui demande mais que cela ne corresponde pas a l'attente du codeur ?

    S'il y a une erreur donné par le compilo, quelle est elle ?


    Bref, a suivre ...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    C'était en effet le problème du \n Les printf ce s'affichaient pas...
    l'allocation marche en tout cas

    donc en fait c'est l'écriture qui ne passe pas (pourtant je pensais avoir essayé de voir si c'était le malloc qui ne passait pas ou l'écriture ).

    voilà maintenant le petit rebelle :
    la lecture des 54 premiers octetcs ne m'intéressent pas, j'ai donc mis çà "à la poubelle" parce que je ne savais pas comment m'en débarasser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int lire_pixels(int de, entete_bmp *entete, unsigned char *pixels){
        char poubelle;
        read(de, &poubelle, 54);
        printf("étape lirepixel \n");
        return read(de, pixels, entete->bitmap.taille_donnees_image);
    }
    en sachant que mon allocation a été faite avec cette autre fonction :
    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
     
    int copier_bmp(int de, int vers){
        entete_bmp entete;
        unsigned char *pixels;
     
        /*lecture du fichier source*/
        lire_entete(de, &entete);
        pixels = allouer_pixels(&entete);
        printf("Allouement effectué \n");
        lire_pixels(de, &entete, pixels);
        printf("Lire pixel OK \n");
     
        /*écriture du fichier destination*/
        ecrire_entete(vers, &entete);
        ecrire_pixels(vers, &entete, pixels);
     
        /*on libère les pixels*/
        free(pixels);
        return 1;

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je ne comprend plus rien. Lors de ton premier post, tu disais avoir un probleme de malloc. C'est juste parce le printf ne s'affichait pas ??

    Maintenant tu dis, "voilà maintenant le petit rebelle :"

    Il y a un probleme avec cette fonction ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 65
    Par défaut
    Ah oui désolé de ne pas être assez précis.
    Au départ je pensais que c'était le malloc qui ne passait pas.
    J'avais essayé en mettant des printf avant et après, sauf que comme j'avais oublié ce fameux '\n' et bien le printf ne s'affichait pas. Donc du coup je pensais que le malloc ne fonctionnait pas.

    Maintenant j'ai pu faire des autres tests et c'est bien l'écriture qui ne fonctionne pas :
    read(de, pixels, entete->bitmap.taille_donnees_image);

  10. #10
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    ^^

    L'ecriture ne fonctionne pas ?

    C'est a dire ? Je ne suis pas calé avec read, donc tout indice peut etre bon a prendre.

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

Discussions similaires

  1. Erreur de segmentation sur malloc
    Par kolodz dans le forum Débuter
    Réponses: 4
    Dernier message: 26/03/2015, 09h06
  2. Erreur de segmentation GTK2.0 incomprise
    Par baguiwoopy dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 24/04/2012, 20h36
  3. Erreur de segmentation GTK2.0 incomprise
    Par baguiwoopy dans le forum C
    Réponses: 2
    Dernier message: 24/04/2012, 19h44
  4. [GMP] Erreur de segmentation incomprise
    Par SeaX dans le forum C
    Réponses: 0
    Dernier message: 21/02/2008, 14h55
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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