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 renvoie sigsev de temps en temps


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Points : 1 837
    Points
    1 837
    Par défaut malloc renvoie sigsev de temps en temps
    Bonjour,

    Je fais actuellement un programme en C pour lequel je dois toucher à des listes chaînées. J'appelle donc beaucoup de fois la fonction List_Insert. Mon problème est que mes malloc me renvoient de temps en temps sigsev. C'est très surprenant sachant que j'ai le même problème en faisant malloc(10000) et que ma mémoire est très loin d'être saturée. Ça fait plusieurs heures que je ne vois pas mon erreur, si quelqu'un pouvait m'aider... Définitivement le C est mon langage préféré...

    J'utilise le code suivant :

    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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    MusicFile List_CopyNode(const MusicFile src)
    {
        MusicFile *dest;
        dest = malloc(sizeof(MusicFile)); // Ce malloc pose parfois problème
        dest->Lenght = src.Lenght;
        dest->Score = src.Score;
        dest->Title = malloc(sizeof(char*));
        strcpy(dest->Title,src.Title);
        return *dest;
    }
    void List_Append(list *l, MusicFile data)
    {
        node* NewNode;
        NewNode = malloc(sizeof(node)); // Ce malloc passe parfois problème.
        list InitialPos;
        InitialPos = (*l);
        NewNode->data = List_CopyNode(data);
        while((*l)->next != NULL)
            (*l)=(*l)->next;
        (*l)->next =NewNode;
        (*l)=NewNode;
        (*l)->next=NULL;
        (*l) = InitialPos;
    }
    void List_Add(list *l, MusicFile data)
    {
        node *temp;
        temp=(node *) malloc(sizeof(node));
        temp->data = List_CopyNode(data);
        if (*l == NULL)
        {
            (*l)=temp;
            (*l)->next=NULL;
        }
        else
        {
            temp->next=(*l);
            (*l)=temp;
        }
    }
    void List_Addafter(list *l,MusicFile data, int position)
    {
        int i;
        list temp,left,right;
        right=(*l);
        for(i=1;i<position;i++)
        {
            left = right;
            right = right->next;
        }
        temp=(node *)malloc(sizeof(node));
        temp->data = List_CopyNode(data);
        left->next=temp;
        left=temp;
        left->next=right;
    }
    void List_Insert(list *l, MusicFile data) // Erreur si la lite est vide
    {
        int c=0;
        list temp;
        temp = *l;
        if(temp==NULL)
            List_Add(l,data);
        else
        {
            while(temp!=NULL)
            {
                if(strcmp(temp->data.Title,data.Title)<0)
                    c++;
                temp=temp->next;
            }
            if(c==0)
                List_Add(l,data);
            else if(c<List_GetSize(*l))
                List_Addafter(l,data,++c);
            else
                List_Append(l,data);
        }
    }
    size_t List_GetSize(list l)
    {
        int c=0;
        while(l!=NULL)
        {
            l=l->next;
            c++;
        }
        return c;
    }
    Merci de votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Il y a pas mal de problèmes dans ce code, et le plus évident se trouve dans la fonction List_CopyNode():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       dest->Title = malloc(sizeof(char*));
        strcpy(dest->Title,src.Title);
    Ici, tu alloues la taille d'un pointeur (probablement 4 octets). Puis tu copies un titre (qui fait probablement plus que 4 charactères) vers ce buffer de 4 octets. Ca va très probablement planter. La solution, c'est d'allouer un buffer suffisamment grand pour contenir tout le titre, plus le 0 qui finit chaque chaine de caractères en C.
    Dans ton cas, le plus simple pour faire ça c'est encore d'appeler la fonction strdup, qui alloue un buffer suffisant et copie les caractères.

    Il y a d'autres soucis dans ce code. On dirait que tu ne maitrises pas bien l'utilisation des pointeurs, et que tu copies très souvent des structures entières, plutôt que de les passer en utilisant des pointeurs.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Citation Envoyé par emixam16 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MusicFile List_CopyNode(const MusicFile src)
    {
        MusicFile *dest;
        dest = malloc(sizeof(MusicFile)); // Ce malloc pose parfois problème
        // ...
        return *dest;
    }
    Concernant justement ce malloc, quand libères-tu cette mémoire allouée ? Et surtout comment ?

Discussions similaires

  1. Renvoie d'une mesure de temps dans un champ
    Par myrddin99 dans le forum Access
    Réponses: 13
    Dernier message: 26/04/2012, 22h23
  2. Réponses: 0
    Dernier message: 23/11/2007, 14h45
  3. [Temps] Calendrier temps Unix?
    Par pigeonfurtif dans le forum Administration système
    Réponses: 3
    Dernier message: 26/06/2007, 08h17
  4. [ppc] Malloc renvoie NULL !
    Par FamiDoo dans le forum C++
    Réponses: 4
    Dernier message: 18/08/2006, 10h01

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