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 :

Allouer dynamiquement plusieurs variables


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Allouer dynamiquement plusieurs variables
    Bonjour/Bonsoir à tous,

    J'aimerai allouer dynamiquement une quarantaine de tableaux (de taille 576) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    unsigned char* var1;
    unsigned char* var2;
    unsigned char* var3;
    unsigned char* var4;
    unsigned char* var5;
    unsigned char* var6;
    //...
    unsigned char* var39;
    unsigned char* var40;
    étant donné que je suis un petit développeur assez fainéant, je ne voulais pas utiliser une quarantaine de fois la fonction malloc(), j'ai donc stocké les 40 variables dans un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char* var[] = {var1, var2, var3, var4, var5, ..., var40};
    Puis j'ai alloué dynamiquement chaque élément du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i = 0 ; i < 40 ; i++)
    {
        var[i] = (unsigned char*) malloc (sizeof (unsigned char) * 576);
    }
    Le problème, c'est que cela ne marche pas, en effet lorsque j'essaye d'enregistrer des valeurs dans la variable var1, le programme plante systématiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i = 0 ; i < 10 ; i++)
    {
        var1[i]=0; //ne fonctionne pas
    }
    J'ai donc deux questions :
    • Pourquoi mon code ne marche pas?
    • Comment puis-je corriger ce problème?


    Le code en entier (j'ai supprimé quelques variables pour une meilleure lisibilité) :

    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
     
    int main(int argc, char* argv[]){
        unsigned char* var1;
        unsigned char* var2;
        unsigned char* var3;
        unsigned char* var4;
        unsigned char* var5;
        unsigned char* var6;
        unsigned char* var7;
        unsigned char* var8;
        unsigned char* var9;
        unsigned char* var10;
     
     
        unsigned char* var[] = {var1,var2,var3,var4,var5,var6,var7,var8,var9,var10};
     
        for (int i = 0 ; i < 10 ; i++)
        {
            var[i] = (unsigned char*) malloc (sizeof (unsigned char) * 576);
        }
     
        for (int i = 0 ; i < 10 ; i++)
        {
            var1[i]=0; //ne marche pas
        }
     
        return 0;
     
    }
    Je précise aussi qu'il n'y a pas d'erreur de compilation.

    Voilà, merci et bonne soirée à vous tous !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 639
    Points : 10 593
    Points
    10 593
    Par défaut
    Ton problème est trivial : tu as créé ("malloc"é si tu préfères) les 10 cases de ton tableau var, mais aucune variable varXX

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Mince, je n'avais pas vu

    malloc() retourne une adresse qui écrase l'adresse de varX, je n'y avais pas pensé tout de suite.

    Encore merci foetus, bonne soirée à vous tous !

    Je marque le sujet comme résolu.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 673
    Points
    23 673
    Par défaut
    Bonjour,

    Citation Envoyé par Smashmaster Voir le message
    malloc() retourne une adresse qui écrase l'adresse de varX, je n'y avais pas pensé tout de suite.
    C'est un poil plus subtil encore : lorsque tu crées tes 40 variables, puis que tu alloues ton tableau en spécifiant leur nom, tu remplis ton tableau avec la valeur actuelle des variables en question, pas avec leur adresse propre. Il n'y a donc aucun lien entre ton tableau et les variables initiales une fois l'opération effectuée.

    Le mieux consiste à déclarer directement un tableau de pointeurs de 40 entrées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char * var[40];
    … puis de les initialiser avec un malloc dans une boucle comme tu le fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=0; i<40; i++) var[i] = malloc(sizeof (unsigned char) * 576);
    … mais surtout, si toutes tes entrées ont la même taille, que celle-ci est relativement modeste et que tu ne libères jamais cette place avant la fin du programme ou du bloc ou elles sont déclarées, alors le plus simple consiste à déclarer directement un tableau à deux dimensions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        unsigned char var [40][576]; /* Attention : pas de « * » ici */
    Cela dit, cela donne ici un tableau de 22,5 Kio. C'est encore acceptable mais il faudra effectivement veiller à ne pas remplir la pile trop loin de cette façon.

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

Discussions similaires

  1. Envoyer plusieur variable a un programme
    Par scaleo dans le forum Langage
    Réponses: 9
    Dernier message: 06/09/2005, 11h09
  2. envoyer plusieurs variables dans l'url?
    Par brgui dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/08/2005, 14h18
  3. Réponses: 5
    Dernier message: 28/04/2004, 16h06

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