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 :

Cannot access memory


Sujet :

C

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 119
    Points
    119
    Par défaut Cannot access memory
    Bonsoir,

    Voici mon code qui provoque une erreur de segmentation et lorsque je fais tourner avec gdb et que j'essai d'accéder à s->mat[0][0] j'ai un "Cannot access memory" mais je ne vois pas d'où cela peut venir.

    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
    struct sol {
      double **mat;
      double a;
    };
     
    typedef struct sol *sol;
     
    double **creerMatrice(int l, int c)
    {
      double **m=malloc(l*sizeof(double*));
      for (int i=0 ; i<l ;i++) 
        { 
          m[i]=malloc(c*sizeof(double));
        }
      return m;
    }
     
    sol creerSol(int n, int c)
    {
      sol s=malloc(sizeof(sol));
      s->mat=creerMatrice(n,c);
      s->a=0;
     
      return s;
    }
     
    sol test(int n, int c)
    {
    sol s=creerSol(n,c);
    s->mat[0][0]=0; // Erreur de segmentation ici
    s->mat[0][1]=1;
    return s;
    }

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Cacher des pointeurs via un typedef est une source de confusions qu'il est préférable d'éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sol s=malloc(sizeof(sol));
    sol est de type pointeur et non structure.

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Un moyen d'éviter cela, c'est de ne pas utiliser sizeof avec le nom du type mais avec une instance du type pour lequel on désire allouer de la mémoire. Ainsi, le code de ton malloc() devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sol s = malloc(sizeof *s);
    Malgré cette manière d'éviter la difficulté, cacher un pointeur dans un typedef reste néanmoins une très mauvaise pratique.

    Avec mes meilleures salutations

    Thierry

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

Discussions similaires

  1. DCOM Problem access memory
    Par metek dans le forum MFC
    Réponses: 7
    Dernier message: 08/08/2007, 11h38
  2. Violation access memory
    Par breezer911 dans le forum C++
    Réponses: 8
    Dernier message: 05/04/2007, 09h26
  3. Réponses: 15
    Dernier message: 21/01/2007, 22h47
  4. Réponses: 7
    Dernier message: 16/06/2006, 11h09
  5. [SIGBUS] Cannot Access Memory apres un Malloc?
    Par predacktor dans le forum C
    Réponses: 5
    Dernier message: 18/03/2006, 17h11

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