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 :

Allocation mémoire, je ne comprends pas !


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut Allocation mémoire, je ne comprends pas !
    J'ai une fonction qui réalise une allocation mémoire qui est la suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int alloc_matrice_couts(int nbjobs, int** matrice_couts) {
      matrice_couts = (int**)malloc(nbjobs * nbjobs * sizeof(int));
      if(matrice_couts == NULL){
        perror("Erreur d'allocation mémoire (matrice des couts)");
        return -1;
      }
      return 0;
    }
    Dans mon programme, je fais appel à cette fonction pour allouer une matrice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int** matriceCouts;
     
    if(alloc_matrice_couts(cfg.nbJobs, matriceCouts) == -1)
        return -1;
     
    /* mise a 0 de la diagonale */
      for(i = 0; i < cfg.nbJobs; i++)
        matriceCouts[i][i] = 0;           // C'est ici que ca plante
    L'allocation a l'air de se passer correctement, mais lorsque j'essai d'accéder aux éléments de ma matrice j'obtient une erreur de segmentation, qu'elle est mon erreur ?

    Merci.
    Bouba

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    int matriceCouts** déclare un pointeur sur un pointeur qui pointe vers un entier, pas un tableau à deux dimensions vers des entiers. matriceCouts peut être utilisé pour un tableau de pointeurs, non pour un tableau d'entiers à deux dimensions.

    Plusieurs astuces sont possibles. L'une des plus simples consiste à créer un tableau à une dimension avec matriceCouts, où chaque élément est un pointeur vers un tableau d'entier. Ainsi matriceCouts[i][j] ira chercher l'élément j du tableau matriceCouts[i] qui est lui même l'élément i du tableau matriceCouts.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int** matriceCouts; 
     
    if(alloc_matrice_couts(cfg.nbJobs, matriceCouts) == -1) 
        return -1; 
     
    /* mise a 0 de la diagonale */ 
      for(i = 0; i < cfg.nbJobs; i++) 
        matriceCouts[i][i] = 0;
    matriceCouts ne peut PAS être modifié par alloc_matrice_couts et reste donc non initialisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int alloc_matrice_couts(int nbjobs, int** matrice_couts) { 
      matrice_couts = (int**)malloc(nbjobs * nbjobs * sizeof(int));
    Tu alloue des int et tu prétend obtenir un int** ???? De plus, matrice_couts est une variable locale à la fonction
    Probablement, tu voulais un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int alloc_matrice_couts(int nbjobs, int** matrice_couts) { 
      *matrice_couts = malloc(nbjobs * nbjobs * sizeof(int)); 
      if(*matrice_couts == NULL){ 
        perror("Erreur d'allocation mémoire (matrice des couts)"); 
        return -1; 
      } 
      return 0; 
    }
    ....
    int* matriceCouts; 
     
    if(alloc_matrice_couts(cfg.nbJobs, &matriceCouts) == -1) 
        return -1;
    ....
    A noter que ceci ne te permettra PAS d'écrire matriceCouts[i][j] et que tu dois traiter matriceCouts comme un tableau à une dimension et calculer toi même les indices :
    matriceCouts[i*cfg.nbJobs+j]
    Si tu veux écrire matriceCouts[i][j] , il faut revoir la conception du tableau. Voir la Faq

  4. #4
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Ca fonctionne maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int alloc_matrice_couts(int nbjobs, int** matrice_couts) {
      *matrice_couts = (int*)malloc(nbjobs * nbjobs * sizeof(int));
      if(matrice_couts == NULL){
        perror("Erreur d'allocation mémoire (matrice des couts)");
        return -1;
      }
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int* matriceCouts;
     
    /* Allocation de la matrice des couts */
    if(alloc_matrice_couts(cfg.nbJobs, &matriceCouts) == -1)
      return -1;
     
    /* mise a 0 de la diagonale */
    for(i = 0; i < cfg.nbJobs; i++)
      *(matriceCouts + (i*cfg.nbJobs+i)) = 0;
    Merci

    Bouba

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      *matrice_couts = (int*)malloc(nbjobs * nbjobs * sizeof(int)); 
      if(matrice_couts == NULL){ 
        perror("Erreur d'allocation mémoire (matrice des couts)");
    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(*matrice_couts == NULL){ ....
    Accessoirement, il est plus facile de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int  * alloc_matrice_couts(int nbjobs)
     { 
       return malloc(nbjobs * nbjobs * sizeof(int)); 
     
    }
    ....
    int* matriceCouts; 
    /* Allocation de la matrice des couts */
     matriceCouts =alloc_matrice_couts(cfg.nbJobs) ;
    if(matriceCouts ==NULL)   return -1;
    ....

  6. #6
    Membre confirmé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    A oui, j'avais oublié de déréférencer dans le if, merci !
    Bouba

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

Discussions similaires

  1. Perte de mémoire - je ne comprend pas.
    Par pilouface dans le forum C
    Réponses: 12
    Dernier message: 08/02/2007, 16h39
  2. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  3. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59
  4. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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