Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] pointeur et tableau static

    16 août 2006 à 21:09:32

    Bonjour, je suis tombé sur une erreur que je ne connaissait pas en compilant un programme en C .
    Alors j'ai fais quelques tests et il y a quelque chose que je n'arrive pas a comprendre.

    Voici le programme de test:


    #include<stdio.h>

    void plus1(int *p)
    {
      *p=*p+1;
    }

    int main(void)
    {
      int a=3;
      int t[2]={10,11};
      int t2[2][2]={{10,11},{12,13}};
      int *p;

      printf("a=%d\\n",a);
      plus1(&a);
      printf("a=%d\\n",a);
      putchar('\\n');
      printf("t[0]=%d\\n",t[0]);
      plus1(t);
      printf("t[0]=%d\\n",t[0]);
      putchar('\\n');
      printf("t2[0][0]=%d\\n",t2[0][0]);
      //plus1(t2);
      printf("t2[0][0]=%d\\n",t2[0][0]);
     
       
    }


    pas de probleme lors de la compilation.

    a=3
    a=4

    t[0]=10
    t[0]=11

    t2[0][0]=10
    t2[0][0]=10


    et le resultat et comme prévu. nikel :)

    mais si je j'enleve les commentaires de la ligne:
    //plus1(t2);

    il se provoque une erreure de compilation:

    tab2p.c: Dans la fonction «main» :
    tab2p.c:24: attention : passing argument 1 of «plus1» from incompatible pointer type

    Ma question c'est POURQUOI ??
    la fonction demande un pointeur d'entier et c'est ce que je lui donne, enfin c'est ce que je pense.
    A moins que le fais de declarer un tableau static a 2 entrée ne crée pas un pointeur?!

    si quelqu'un peut m'expliqué je suis preneur.

    Pour info:
    je suis sous linux Ubuntu.
    compilateur: gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2006 à 21:30:15

      Bah, dans ta fonction plus1, tu ne renvoit rien du tout...
      Change la ligne *p = *p + 1 en return *p = *p + 1 et ça marchera.
      • Partager sur Facebook
      • Partager sur Twitter
        16 août 2006 à 21:34:02

        heu non c'est une erreur de ma part la fonction plus1 renvoi void (corriger)
        et non ca ne change rien de toute façon, c'est l'argument qui ne lui plai pas.

        [EDIT]
        j'ai fais de nouveau tests:

        t2=-1079558888
        *t2=-1079558888

        apparament t2 est bien un pointeur sinon le compilateur n'accepterait pas que je place * devant t2.
        Mais ca me parrait etrange, trés étrange même que t2==*t2.

        [REEDIT]
        retest...

        t2=0xbfa8ca08
        *t2=0xbfa8ca08
        t2[0]=0xbfa8ca08
        *t2[0]=0xa
        t2[1]=0xbfa8ca10
        *t2[1]=0xc

        Bon maintenant je ne comprend pas pourquoi *t2!=*t2[0]
        par contre on vois tres bien que t2[0] et t2[1] sont des pointeur d'entier!
        la preuve:

        (t2[1]+1)=0xbfe43404
        *(t2[1]+1)=0xd

        [REREEDIT]
        Bon je crois que je vais allé dormir parceque je comprend plus rien:

        printf("&t2=%p\n",&t2);
          printf("t2=%p\n",t2);
          printf("*t2=%p\n",*t2);
          printf("*(*t2)=%p\n",*(*t2));


        &t2=0xbfbeb1a8
        t2=0xbfbeb1a8
        *t2=0xbfbeb1a8
        *(*t2)=0xa


        on a donc un pointeur a l'adresse 0xbfbeb1a8
        qui contien 0xbfbeb1a8
        c'est donc un pointeur qui pointe sur lui même.
        si on lui demande la valeur vers laquelle il pointe il nous repond : 0xbfbeb1a8
        normale c'est lui même.
        mais si on lui demande la valeur pointé par ce qu'il pointe lui même, lui en toute logique,
        il nous repond 10 o_O
        MAIS COMMENT QUIL FAIT!!!


        • Partager sur Facebook
        • Partager sur Twitter

        [C] pointeur et tableau static

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown