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 :

[Tableau]sizeof et realloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut [Tableau]sizeof et realloc
    Bonjour,
    Je crée dynamiquement un tableau à deux dimension
    on entre le nombre de ligne nl et nc le nombre de colonne et je crée le tableau
    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
     
     int **mat1, nl, nc, i, j;
    printf("Nombre de lignes : \n");
      scanf("%d",&nl);
     mat1 = malloc(nl*sizeof(int*));
     printf("Nombre de colones : \n");
     scanf("%d",&nc);
     for (i=0; i<nl; i++) {
        mat1[i] = malloc(nc*sizeof(int));
     }
       for (i=0 ; i<nl; i++) {
            printf("element de la ligne %d : ",i+1);
            for (j=0 ; j<nc; j++) {
               scanf("%d",&mat1[i][j]);
            }
        }
    Je saisi sans pb ma matrice et je l'affiche.
    J'aimerai savoir
    - comment savoir la taille mémoire occupée par ma matrice mat1 : je fais sizeof(mat1) et ça ne donne rien de bon.
    - comment redimentionner l'espace de ma matrice : par exemple je veux aumenter le nombre de ligne (de nl à nl + x) x à entrer et de colonnes (de nc à nc+y) y aussi à entrer.

    Quelqu'un a-til déja traiter un pb pareil ?
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    D'abord précaution ELEMENTAIRE toujours vérifier le retour de malloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     mat1 = malloc(nl*sizeof(int*));
    if (mat1 == NULL )
        exit(1);
    sinon CRASH !!!



    pour la taille c'est pas bien compliqué...

    nl*nc (int) + nl (int*)



    Et enfin pour le reste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mat1 = realloc ( mat1, (newnl * sizeof(int*) )
    if ( mat1 == NULL )
      exit(1)
     
    etc....

  3. #3
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Par défaut
    Merci,
    J'obtenai la taille de façon détaillée. J'ai cru qu'il y avait moyen de l'obtenir directement du genre sizeof(mat1)

    Merci.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    ATTENTION!
    Mauvaise utilisation de realloc(), puisque mat1 est toujours valide si realloc() échoue.

    Bon, c'est vrai que pour un exit(1) ça ne fait pas grande différence, mais bon, c'est sale...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Juste une petite précision pour tous, et Médinoc en particulier.. Je le pensais bien, mais j'ai été vérifier...

    Contrairement à ce que tu cites :

    Mauvaise utilisation de realloc(), puisque mat1 est toujours valide si realloc() échoue
    C'est faux....

    realloc retourne NULL si la REQUETE échoue..

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mat1 = (char *) realloc ( mat1, newsize);
    retourne NULL si ça échoue, et donc mat1 est NULL (même si la place mémoire concernée est toujours allouéé)....

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Medinoc a raison. C'est une mauvaise utilisation de realloc.
    Si jamais realloc renvoie NULL, tu ne pourras pas libérer la mémoire qui aura été préalablement allouer. Il est donc préférable de passer par un pointeur temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    temp = realloc ( mat1, newsize);
     
    if (temp == NULL ) 
    {
         /* traitement de l'erreur */
    }
    else
    {
         mat1 = temp ;
    }

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

Discussions similaires

  1. Modification de la taille d'un tableau 3D avec realloc
    Par Bobsleigh dans le forum Débuter
    Réponses: 8
    Dernier message: 10/11/2009, 21h01
  2. Probleme de realloc pour un tableau 2D
    Par ptit_riton dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 27/12/2008, 18h08
  3. sizeof & tableau de chaine de caratere
    Par la_chevre dans le forum Débuter
    Réponses: 13
    Dernier message: 11/09/2008, 11h18
  4. Probleme de realloc sur un tableau 2d.
    Par gnouz dans le forum C
    Réponses: 9
    Dernier message: 08/06/2007, 13h35
  5. [Debutant]reallocation de memoire d'un tableau de type perso
    Par killerjeff dans le forum Débuter
    Réponses: 3
    Dernier message: 04/08/2004, 17h09

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