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 dynamique tableau


Sujet :

C

  1. #1
    Membre habitué Avatar de dream_of_australia
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 167
    Points : 136
    Points
    136
    Par défaut Allocation dynamique tableau
    Bonjour à tous,

    J'essaie d'allouer dynamiquement la taille d'un tableau de chaînes de caractères (donc char *).
    Mon tableau se nomme explorateur->files, déclaré comme char** files ; dans une struct explorateur.
    Je calcule tout d'abord le nombre d'éléments que contiendra le tableau, que je mets dans la variable cmpt.
    Puis je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    explorateur->files = (char**) malloc(cmpt * sizeof(char *)) ;
    for (i=0 ; i<cmpt ; i++)
       explorateur->files[i] = (char *) malloc (255 * sizeof (char)) ;
    255 caractères est la taille maxi qu'auront les chaînes.

    Mon programme quitte immédiatement (segmentation fault). Quelle erreur ai-je fait ici ?

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    soit cmpt est trop grand, soit explorateur ne pointe sur rien.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre habitué Avatar de dream_of_australia
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 167
    Points : 136
    Points
    136
    Par défaut
    Merci pour ta réponse.

    cmpt est dans mon test égal à 9.

    explorateur quant à lui pointe bien sur quelque chose puisque j'arrive à récupérer d'autres éléments. C'est une struct, et j'arrive à récupérer par exemple le cmpt, qui est placé dans explorateur->nbFiles.


    Après d'autres tests, c'est la première ligne qui fait déjà tout planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur->files = (char **) malloc(cmpt * sizeof(char *)) ;

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Poste un code compilable qui reproduise l'erreur.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Il nous faut la declaration du type de 'explorateur' ainsi que le moment ou tu alloue dynamiquement 'explorateur'. Il nous faut aussi un code minimal pour isolé l'erreur car tel quel, je ne vois pas d'erreur dans ton code.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Au passage, si la taille de chaque ligne est destinée à être fixe, allouer un tableau à deux dimensions plutôt qu'un tableau de tableaux peut être une bonne idée:
    http://www.developpez.net/forums/m1803870-7/
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre habitué Avatar de dream_of_australia
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2007
    Messages : 167
    Points : 136
    Points
    136
    Par défaut
    Apparemment c'est l'oubli de l'allocation de l'objet entier qui était en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur = (EXPExplorateur *) malloc (sizeof (EXPExplorateur)) ;
    Merci SofEvans

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Le cast pour le type de retour n'est pas obligatoire en C, voici un autre appel possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur = malloc (sizeof (* explorateur)) ;
    Ca simplifie la lisibilité et la maintenance également de cette manière
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Citation Envoyé par dream_of_australia Voir le message
    Apparemment c'est l'oubli de l'allocation de l'objet entier qui était en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur = (EXPExplorateur *) malloc (sizeof (EXPExplorateur)) ;
    Merci SofEvans
    Mais de rien

    J'ai eu une petite incertitude quand j'ai vu que tu faisais '->' pour explorateur, c'est pour ca que je t'ai demander le moment ou tu l'as allouer ^^

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    soit explorateur ne pointe sur rien.
    Citation Envoyé par dream_of_australia Voir le message
    explorateur quant à lui pointe bien sur quelque chose puisque j'arrive à récupérer d'autres éléments.
    Citation Envoyé par dream_of_australia Voir le message
    Apparemment c'est l'oubli de l'allocation de l'objet entier qui était en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur = (EXPExplorateur *) malloc (sizeof (EXPExplorateur)) ;
    J'ai l'impression que tu prends vraiment les gens pour des imbéciles, non? Que tu ne me remercies pas ne me dérange pas, mais que tu ne t'excuses pas en revanche...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message

    Citation:
    Citation Envoyé par nicolas.sitbon
    soit explorateur ne pointe sur rien.
    Citation:
    Citation Envoyé par dream_of_australia
    explorateur quant à lui pointe bien sur quelque chose puisque j'arrive à récupérer d'autres éléments.
    Citation:
    Citation Envoyé par dream_of_australia
    Apparemment c'est l'oubli de l'allocation de l'objet entier qui était en cause :
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    explorateur = (EXPExplorateur *) malloc (sizeof (EXPExplorateur)) ;


    J'ai l'impression que tu prends vraiment les gens pour des imbéciles, non? Que tu ne me remercies pas ne me dérange pas, mais que tu ne t'excuses pas en revanche...
    Justement, ce détail me taraudé ...
    Si on declare une structure et que l'on declare juste un pointeur vers cette structure, cela n'est qu'un pointeur non ? Il n'y a aucune possibilité ne serait-ce que de nommer un champ de cette structure si on ne possede qu'un pointeur pointant sur une adresse indeterminé ?

    [HS]
    Je comprend la reaction de nicolas.sitbon. Un simple "Merci tout le monde" aurai largement suffit ...
    nicolas.sitbon, je ne pense pas que dream_of_australia se moque de toi, il pensait juste bien faire et a mal fait apparemment. Je le concede, des excuse aurait été les bienvenue.
    [/HS]

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Justement, ce détail me tarauder ...
    Si on declare une structure contenant des pointeur et que l'on declare juste un pointeur vers cette fonction,
    tu veux dire vers cette structure, n'est ce pas?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    J'ai du mal m'exprimer (c'est normal vu ce que j'ai ecrit ^^)


    Par exemple :

    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
     
    /* Definition de la stucture */
    typedef struct Test Test
    struct Test
    {
       int champ1;
       int champ2;
       char champ3
    }
     
    int main ()
    {
        Test *pointeurVersTest;
     
        /* Ceci devrait declencher un fatal error, non ? */
        int mauvaiseRecuperation = pointeurVersTest->champ1
     
     
    }
    EDIT : Je viens de comprendre, j'ai editer mon message, c'est pour ca que tu as lu ceci. En effet, c'etait bien vers structure et non fonction (je ne sais pas a quoi je pensais au moment ou j'ecrivais

  14. #14
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par Franck.H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explorateur = malloc (sizeof (* explorateur)) ;
    Les parenthèses ici sont superflus.

    Citation Envoyé par SofEvans Voir le message
    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
     
    /* Definition de la stucture */
    typedef struct Test Test
    struct Test
    {
       int champ1;
       int champ2;
       char champ3
    }
     
    int main ()
    {
        Test *pointeurVersTest;
     
        /* Ceci devrait declencher un fatal error, non ? */
        int mauvaiseRecuperation = pointeurVersTest->champ1
     
     
    }
    Pas systématiquement, il me semble que le comportement est indéfinis, ton pointeur "" n'est pas initialisé, le déréférencer c'est aller chercher des soucis (dans les meilleurs des cas tu peux espérer une fin anormale, dans le pire tout passe inaperçu). Initialiser ces pointeurs à NULL est une bonne habitude.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Les parenthèses ici sont superflus.
    Ca c'est une question de gout... moi je les mets toujours
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  16. #16
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    ssmario2 :
    Pas systématiquement, il me semble que le comportement est indéfinis, ton pointeur "" n'est pas initialisé, le déréférencer c'est aller chercher des soucis (dans les meilleurs des cas tu peux espérer une fin anormale, dans le pire tout passe inaperçu). Initialiser ces pointeurs à NULL est une bonne habitude.
    Même avec pointeurVersTest initialisé à NULL, le code va planter. Si on veut déréférencer le pointeur, il faut qu'il pointe sur un objet valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main ()
    {
       Test test ;    
       Test *pointeurVersTest = & test ;
       pointeurVersTest->champ1 = .....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  17. #17
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Je n'ai pas dit le contraire, si on peut initialiser à une valeur valide tant mieux, autrement
    NULL est plus approprié (le but est que le programme crash si jamais on déréférence le pointeur ce qui n'est pas le cas avec un pointeur non initialisé).
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

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

Discussions similaires

  1. problème allocation dynamique tableau 2d
    Par virtual_bug dans le forum C++
    Réponses: 16
    Dernier message: 17/04/2012, 11h21
  2. Allocation dynamique tableau
    Par cstan dans le forum C++
    Réponses: 3
    Dernier message: 10/10/2011, 14h37
  3. constructeur allocation dynamique tableau
    Par Heimdall dans le forum C++
    Réponses: 7
    Dernier message: 20/03/2011, 23h15
  4. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 10h57
  5. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 09h03

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