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 :

affectation sur un tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut affectation sur un tableau dynamique
    Bonjour,

    Je souhaiterai savoir si l'affectation est bien comme ceci (pour tabA[0]), car quand je libère à la fin, j'ai une erreur de segmentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    size_t l;
      // pas de control sur malloc() et de free() pour l'exemple
      char **tabA = malloc(3 * sizeof *tabA);
      for (l = 0; l < 3; l++)
          tabA[l] = malloc (10+1 * sizeof *tabA[l]);
     
      tabA[0] = "Bonjour";
      printf("\ntabA[0] -> %s", tabA[0]); // Bonjour

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Lorsque tu fais tabA[0] = "bonjour", tu affectes à tabA[0] une adresse en mémoire statique (et au passage tu as une fuite mémoire puisque l'ancienne adresse n'est pas libérée), ce qui fait que ça plante au moment de la libération.
    Il faut faire strcpy(tabA[0], "bonjour"), pour que ça fonctionne correctement.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    je ne comprend plus rien du tout,
    quand on fait ça:

    char *p;
    on peut écrire :
    p = "bonjour";
    et
    printf("%s", p);
    alors pkoi on peut pas faire la même chose avec tabA

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Par défaut
    je ne comprend plus rien du tout,
    quand on fait ça:

    char *p;
    on peut écrire :
    p = "bonjour";
    et
    printf("%s", p);
    alors pkoi on peut pas faire la même chose avec tabA
    Ceci n'est valable qu'en debut de code.
    tu ne peu pas faire sa au milieu de ton code tu sera donc obliger d'inserer manuellement tes caracteres. C'est a dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    p[0] = 'b'
    ...
    P[8] = '\0' // a ne pas oublier

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ton problème vient de la libération mémoire lorsque tu fais le free.
    Tu ne peux pas libérer de la mémoire qui n'a pas été allouée par un malloc/realloc.
    Comme je l'ai dit précédemment, tu alloues bien de la mémoire par le malloc, ce que tu dois savoir c'est que le malloc renvoie une adresse valide je ne sais plus où exactement en mémoire.
    Ensuite, lorsque tu fais tabA[0] = "bonjour", ce qui se passe c'est que le compilo te file une adresse dans une autre zone de la mémoire où est écrite en dur la chaîne "bonjour", donc ce faisant, tu perds l'ancienne adresse fournie par le malloc (cette zone ne pourra plus être libérée par un free) et la nouvelle adresse n'est plus libérable par un free.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par LeTsIrGoD
    Ceci n'est valable qu'en debut de code.
    tu ne peu pas faire sa au milieu de ton code tu sera donc obliger d'inserer manuellement tes caracteres.
    Mais qu'est-ce que tu racontes... On peut mettre l'adresse d'une chaine dans un pointeur quand on veux...

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par oranoutan
    je ne comprend plus rien du tout,
    quand on fait ça:

    char *p;
    on peut écrire :
    p = "bonjour";
    et
    printf("%s", p);
    alors pkoi on peut pas faire la même chose avec tabA
    On pourrait si on était sûr de n'avoir à faire qu'à des chaines littérales (car ce sont des tableaux de char non modifiables et permanents.

    Il suffirait alors de définir un simple tableau de pointeurs sur char.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Est t-il possible d'avoir un tableau dynamique de chaines à 1 dimension ?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par oranoutan
    Est t-il possible d'avoir un tableau dynamique de chaines à 1 dimension ?
    C'est pas hyper clair comme question, mais à priori, on peut créer dynamiquement tout ce qu'on veut... Le principe, c'est :

    Tableau de n T :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       T *p = malloc (sizeof *p * n);
    Ce qui se décline en :

    Tableau de n char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char *p = malloc (sizeof *p * n);
    Tableau de n char* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char **p = malloc (sizeof *p * n);
    etc.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/11/2013, 09h36
  2. Créer des liens sur un tableau dynamique
    Par SonnyFab dans le forum ASP.NET
    Réponses: 19
    Dernier message: 09/09/2010, 14h05
  3. Affectation dans un tableau dynamique
    Par psohier dans le forum Langage
    Réponses: 2
    Dernier message: 04/08/2010, 20h16
  4. [CS3] Problème sur un tableau dynamique
    Par Yep_yep dans le forum Dreamweaver
    Réponses: 0
    Dernier message: 16/09/2009, 13h08
  5. problème sur un tableau dynamique
    Par boss_gama dans le forum ASP
    Réponses: 9
    Dernier message: 24/08/2006, 17h27

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