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 :

deux façons de créer un tableau de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut deux façons de créer un tableau de pointeurs
    bonjours ,
    j'aimerais creer un tableau de pointeur de deux facon differentes .
    pour la premiere facon on cree un tableau statique .
    (corrigez moi les commentaires si j'ai faux s'il vous plait ).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {   int *p[100],i=0; 
    	for(i=0;i<100;i++){
    		p[i] = malloc(5*sizeof(int));// p[i] est de type (int*) ?
        }
        // p est maintenant de type (*p)[5] ) ?
    	p[90][4]=3; //juste ?
    	p[85][25]=6;//faux ?
     
        return 0;
    }
    mais qu'en ai t'il si je ne sais pas combien de pointeur je veux creer ?

    ce qui nous amene a la deuxieme methode je ne sais pas si on peut le faire , j'ai teste et sa marche pas .
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(void)
    {   //je veux creer un tableau de 100 pointeurs sur int
        //et chaque tableau pointe sur 5 elements
        int **p = NULL,i=0,*temp;
        p= malloc(100 *sizeof(int));
        temp = *p;
        for(i=0;i<5;i++){
            temp = malloc(5*sizeof(int));
            temp++;
        }
     
        //p[50][3]=5;
        //p[3][50]=4;
        // les deux compilent mais segfaultent je ne sais pas pourquoi ?
        return 0;
    }
    voila j'espere avoir ete clair , merci de m'aider .

  2. #2
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    sujet resolu , j'ai trouve comment faire

  3. #3
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    voila la solution au cas ou des gens se poseraient la question
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(void)
    {
        int **p = NULL,i=0;
        p = malloc(100 *sizeof(int));
     
        for(i=0;i<100;i++)
            p[i] = malloc(5*sizeof(int));
     
     
        printf("%d",p[50][3]=5);//VRAI !!!!!
     
        return 0;
    }
    par contre j'aimerais savoir si ce que j'ai ecrit en commentaire dans le premier code est juste , merci .

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *p[100],i=0; 
     
    /*...*/
     
    p[i] = malloc(5*sizeof(int));// p[i] est de type (int*) ?
    Ok.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *p[100],i=0; 
     
    /*...*/
     
    // p est maintenant de type (*p)[5] ) ?
    Non. Avec les parenthèses tu modifies la priorité des opérateurs, du coup on n'a plus la même chose :
    (*p)[5] est un pointeur sur tableau.
    *p[5] est un tableau de pointeur (ce qui correspond en l'occurence à la déclaration de p).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	p[90][4]=3; //juste ?
    	p[85][25]=6;//faux ?
    Ok.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Poa,
    Citation Envoyé par elmcherqui Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
        int **p = NULL,i=0;
     
        /* la ligne ci-dessous est fausse */
     
        p = malloc(100 *sizeof(int)); 
    ...
    Pourquoi fausse ?

    Car rien ne garantit que sizeof(int) = sizeof(*int).

    Ça a marché car pour ton compilateur et la configuration pour laquelle tu compiles, ces valeurs sont égales.
    Mais il ne faut pas partir du principe que c'est obligatoirement le cas, loin de là.

  6. #6
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    Citation Envoyé par droggo Voir le message
    Poa,

    Pourquoi fausse ?

    Car rien ne garantit que sizeof(int) = sizeof(*int).

    Ça a marché car pour ton compilateur et la configuration pour laquelle tu compiles, ces valeurs sont égales.
    Mais il ne faut pas partir du principe que c'est obligatoirement le cas, loin de là.
    sur mon bouquin c'est la methode qu'ils utilisent pour allouer de la memoire .
    si tu a la bonne methode portable je suis preneur.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Moe,
    Citation Envoyé par elmcherqui Voir le message
    sur mon bouquin c'est la methode qu'ils utilisent pour allouer de la memoire .
    si tu a la bonne methode portable je suis preneur.
    Je pensais que ça ressortait clairement de mon message.

    Il suffit de réserver en fonction de la taille d'un pointeur vers int, donc sizeof (*int), et pas pour la taille d'un int.

    Ce n'est pas la même chose, et si ton bouquin assimile ces 2 valeurs, jette-le.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par elmcherqui 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
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {   int *p[100],i=0; 
    	for(i=0;i<100;i++){
    		p[i] = malloc(5*sizeof(int));// p[i] est de type (int*) ?
        }
        // p est maintenant de type (*p)[5] ) ?
    	p[90][4]=3; //juste ?
    	p[85][25]=6;//faux ?
        // Attention, chaque p[i] ne peut recevoir que 5 int => ton 25 dépasse !!!
    
    	for(i=0;i<100;i++)
    		free(p[i]);
        return 0;
    }
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main(void)
    {   //je veux creer un tableau de 100 pointeurs sur int
        //et chaque tableau pointe sur 5 elements
        int **p = NULL,i=0,*temp;
        p= malloc(100 *sizeof(int*));
        // tu veux allouer dans p l'espace de 100 pointeurs et non 100 int !!!
        temp = *p;
        for(i=0;i<5;i++){
            temp = malloc(5*sizeof(int));
            temp++;
        }
        // Houla pas bon. Tu écris temp=x puis temp=y puis temp=temp+1. Tu es certain de ton résultat ???
        for(i=0, temp=p;i<5;i++, temp++){
            *temp = malloc(5*sizeof(int));
        }
        // Et bien sûr remplacer ce "int *temp" déclaré tout en haut par "int **temp" !!!
    
        
        //p[50][3]=5;
        //p[3][50]=4;    => idem remarque précédente
    
    	for(i=0;i<100;i++)
    		free(p[i]);
    	free(p);
    
        return 0;
    }
    Voir ce que j'ai mis en rouge
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    merci les gars je comprend un peu plus maintenant les pointeurs .
    donc en conclusion le bon code pour allouer de la memoire dynamiquement est celui la :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {  int **p,i=0;
     
        p = malloc(100*sizeof(int*));
        for(i=0;i<100;i++)
            p[i]= malloc(5*sizeof(int));
     
        p[50][3]=5; // juste 
     
        for(i=0;i<100;i++)
            free(p[i]);
        return 0;
    }
    Cependant il reste une question .
    qu'elle est le type du pointeur p apres les allocations ?
    Merci .

  10. #10
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    qu'elle est le type du pointeur p apres les allocations ?
    Toujours le même, le typage est static. p est et sera toujours un int**

    edit : tu as oublié de libérer p :-)

  11. #11
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    ok merci pour la reponse , sujet resolu (enfin ! )

  12. #12
    Membre Expert
    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
    Par défaut
    Il faut aussi s'assurer que l'allocation a réussi, en effectuant un test (if).

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

Discussions similaires

  1. Créer un tableau à deux dimensions dynamique
    Par dev14 dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2012, 09h12
  2. Réponses: 3
    Dernier message: 01/09/2011, 14h26
  3. Créer un tableau dynamique de pointeur
    Par Staithes dans le forum Débuter
    Réponses: 4
    Dernier message: 02/12/2010, 07h20
  4. [Tableaux] créer un tableau à partir de deux autres
    Par spaukensen dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2008, 16h22
  5. [XSLT] Créer un tableau à partir de sa description
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/03/2005, 20h01

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