1. #1
    Membre actif
    Avatar de exe2bin
    Inscrit en
    mars 2009
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 420
    Points : 246
    Points
    246
    Billets dans le blog
    3

    Par défaut problème avec realloc()

    Bonsoir à tous ,
    voici le code qui cherche les diviseur d'un nombre :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc,char *argv[])
    {
        int nombre,index = 0,taille = 1;
        int *diviseur = malloc(taille);
     
        if(argc < 2 || atoi(argv[1]) < 4)
        {
            printf("Usage : %s <nombre> --> nombre > 3\n",argv[0]);
            exit(-1);
        }
        nombre = atoi(argv[1]);
        for(int i=1;i<=nombre;i++)
        {
            if(!(nombre%i))
            {
                printf("diviseur trouve !\n");
                *(diviseur + index++) = i;
                if(index == taille)
                {
                    taille *= 2;
                    printf("re-allocation memoire ...\n");
                    if((diviseur = (int *) realloc(diviseur,taille)) == NULL)
                    {
                        printf("ERREUR re-allocation mémoire ...");
                        exit(-1);
                    }
                }
            }
        }
        printf("Diviseurs de %d : ",nombre);
        for(int j=0;j<index;j++) { printf(" %d ",*(diviseur + j)); }
        printf("\n");
        return 0;
    }
    Les 4 premières re-allocation mémoire se passent bien mais dès la 5 sème j'obtiens le message suivant. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    exercice3(50906,0x7fffbfeb73c0) malloc: *** error for object 0x7f82e8402608: incorrect checksum for freed object - object was probably modified after being freed.
    *** set a breakpoint in malloc_error_break to debug
    Abort trap: 6
    Je me doute ,sans en être vraiment certain ,que la zone mémoire doit être translatée à ce moment là ; renseignements pris ,la fonction recopie
    les données dans la nouvelle zone ; aussi ,un pointeur NULL est renvoyé en cas d'échec et là je ne comprend pas pourquoi le printf() n'est pas
    affiché ?!
    Quelqu'un peut-il m'aider à y voir clair ?

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 549
    Points : 2 856
    Points
    2 856

    Par défaut

    Le nombre d'octets alloués est insuffisant. En faisant int *diviseur = malloc(1);, on ne réserve que 1 caractère!, il faut réserver taille*sizeof(int). En réalité le système alloue souvent plus que demandé, c'est pourquoi l'erreur n'apparaît qu'à partir de 5 (qui doit réserver 20 octets au lieu de 5!)

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

Discussions similaires

  1. Problème avec realloc
    Par darkwall_37 dans le forum Débuter
    Réponses: 28
    Dernier message: 10/12/2009, 17h37
  2. Réponses: 4
    Dernier message: 10/03/2008, 03h59
  3. Problème avec realloc et struct
    Par _SamSoft_ dans le forum Bibliothèque standard
    Réponses: 38
    Dernier message: 27/12/2007, 10h13
  4. Re-problème avec realloc() (désolé)
    Par Yabo dans le forum C
    Réponses: 8
    Dernier message: 30/07/2003, 22h07
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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