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 :

Reallocation de mémoire pour un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Par défaut Reallocation de mémoire pour un tableau
    Bonjour,

    Je suis tombé sur une erreur de ce type:

    error: incompatible types in assignment of 'void*' to 'variable* [0]'


    Mon but serait d'avoir un tableau de structure et de pouvoir ajouter des cases à ce tableau pendant l'exécution.

    Voici mon code:

    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
     
     
    struct variable
    {
        int utilisee;
        int typeVariable;
        int valeurChiffre;
        char valeurLettre;
        char valeurChaine;
    };
     
    variable *Variables[0];
     
     //L'erreur est ici.
    Variables = realloc(Variables, 2 * sizeof(variable));
    J'ai donc cherché mon erreur seul et à l'aide de Google mais je n'ai pas trouvé, c'est pourquoi je vous demande de l'aide

    Et ce que je ne comprend pas non plus c'est que j'ai tenté de compiler ce code donné sur cette page soit:

    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 * tabentier;
    /* Création d'un tableau de 3 entiers */
    tabentier = calloc ( 3 , sizeof(int) );
     
    tabentier[0] = 1;
    tabentier[1] = 2;
    tabentier[2] = 3;
     
    /* Ajout d'un element au tableau */
    tabentier = realloc (tabentier, 4 * sizeof(int) );
     
    tabentier[3] = 4;
     
    for ( i = 0 ; i < 3 ; i++ )
    {
         printf(" tabentier[%d] = %d \n", i , tabentier[i] );
    }
    Mais il ne compile pas et me donne la même erreur (je n'ai pas mis les vérifications d'allocations pour que ça soit plus clair )

    Voilà, j'espère que vous pourrez m'aider,
    Merci d'avance

    Neyort.

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Par défaut
    C'est encore moi, je viens de trouver la solution à mon problème!

    J'avais juste oublié la petite étoile montrant qu'il s'agit d'un pointeur et ai fait un cast vers mon type de variable.

    Voici le code pour ceux qui auraient la même erreur que moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct variable
    {
        int utilisee;
        int typeVariable;
        int valeurChiffre;
        char valeurLettre;
        char valeurChaine;
    };
     
    variable *Variables[0];
     
     //La modification
    *Variables = (variable*)realloc(Variables, 2 * sizeof(variable));
    Neyort

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

    Tu m'as l'air de compiler en C++ toi
    Sinon tu aurais dû rajouter le mot clé struct comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct variable *Variables[N];
    et n'aurais pas eu besoin du cast devant realloc().

    Mais attention, cette syntaxe sert à créer un tableau de N pointeurs où chaque case Variables[i] contiendra un pointeur sur struct variable.
    Ici, tu lui mets une taille nulle, il ne pourra donc jamais rien contenir.

    Pour ton cas : un simple pointeur struct variable *Variables; suffit.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Par défaut
    Salut!

    Merci à toi Winjerome pour ta réponse!

    En effet, tu as raison il est plus pratique de mettre directement un struct devant la déclaration de la structure plutôt que de faire un cast à chaque fois

    Merci de cette remarque



    Neyort

  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
    ATTENTION !!!


    Un "realloc" peut échouer...

    Dans ce cas, avec la manière écrite, il n'y a strictement aucun moyen de récupérer ou libérer la mémoire déjà allouée... puisque realloc renverra NULL, et que le pointeur sera écrasé...

    La manière correcte et sûre d'utiliser un realloc est :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    variable *Variables, *tmp;
    int   NVars;
     ....
     
    if ( (tmp = realloc ( Variables, ((NVars+x)*sizeof(variable)) )) != NULL )
     {
         Variables = tmp ;
         NVars = NVars + x ;
     }

    Dans ce cas, si l'allocation échoue, on aura toujours ce qui avait été alloué avant pointé par le pointeur Variables. Là, on peut en faire ce qu'on veut (continuer, ou libérer et abandonner)

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Par défaut
    Salut

    Oui c'est vrai, mais est-il comme malloc, c'est à dire dépendant de la mémoire vive?

    En fait, je pensais qu'il dépendait de la mémoire, c'est à dire qu'il échouait seulement si la mémoire vive était saturée

    Mais faut pas m'en vouloir un

    Merci pour ta précision en tout cas

    Neyort

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

Discussions similaires

  1. allocation mémoire pour tableau de string
    Par alaninho dans le forum C++
    Réponses: 2
    Dernier message: 09/03/2012, 14h44
  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. Réponses: 11
    Dernier message: 26/09/2007, 21h24
  4. [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
  5. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56

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