4
votes

Problème avec les pointeurs et les postfixes

Je dois donc découvrir pourquoi des valeurs spécifiques sont imprimées, et j'en ai résolu la plupart, mais j'ai un problème avec les trois dernières.

Je serais heureux de toute aide

int main(void)
{
    int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
    mess(&myValues[3]); //starts function mess
}

void mess(int *n)
{
    printf("mess :%d\n", *n++); //prints value of 3rd index (1) and sets pointer to fourth index
    printf("mess: %d\n", *++n); //sets n to 5th index and prints its value
    printf("mess: %d\n", -2[n]); //value: -3
    printf("mess: %d\n", (-2)[n]); //value: 1
    printf("mess: %d\n", n[-6]); //value: 32766
}

Je ne comprends tout simplement pas comment les valeurs -3, 1 et 32766 se présentent

p>


6 commentaires

D'où vient ce code? Fuyez.


a [n] est identique à * (a + n) . Remplissez les blancs et vous obtenez votre résultat.


c-faq.com/aryptr/joke.html


@EugeneSh. Nous apprenons en faisant. Rien à craindre.


@nicomp J'ai peur des institutions qui donnent aux étudiants des exercices qui enseignent de mauvaises choses.


@EugeneSh. Vous ne connaissez pas le contexte. Je donne à mes élèves du code avec des gotos, des noms de variables à une lettre, des commentaires incorrects et de nombreux autres exemples négatifs. Cela fait partie du processus d'apprentissage.


3 Réponses :


4
votes
printf("mess: %d\n", n[-6]); //value: 32766

1 commentaires

ce n'est pas mon code, juste un code de notre prof. pour voir à quel point notre compréhension théorique de ce sujet est profonde ... Mais merci encore votre réponse aide beaucoup!



4
votes

Tout d'abord, visualisons la mémoire pointée par n , après l'exécution des deux premières instructions printf () :

 int myValues[] =      { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
                  ???    ^                  ^
       //         n-6   n-5                 n

Voyons voir un par un

  • Instruction 1: printf ("mess:% d \ n", -2 [n]); // valeur: -3

    Vérifiez la priorité des opérateurs . -2 [n] est analysé comme - (2 [n]) . Ainsi, le - est le signe, 2 [n] est le même que n [2] qui est la valeur 3 . Ainsi, la déclaration est la même que

     int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
                                     ^     ^    ^
                          //        n-2    n   n+2
    

    Visualisation :

     int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
                                           ^     ^^
                                        // n     n+2
    
  • Instruction 2: printf ("mess:% d \ n", (-2) [n]); // valeur: 1

    Ici, n [-2] est identique à * (n-2) . Le résultat est la valeur à cet index. (Vérifiez la visualisation ci-dessus).

    Visualisation :

    printf("mess: %d\n", -(n[2]) );       
    
  • Enfin, Instruction 3: printf ("mess:% d \ n", n [-6]); // valeur: 32766

    Selon le contenu actuel du pointeur n , l'index le moins accessible est -5 , en essayant d'accéder à l'emplacement mémoire à un index -6 accède hors limites, provoque un un comportement indéfini . Le résultat ne peut être justifié.

    Visualisation :

    int myValues[] = { 9, 0, 12345, 1, 7, 2, 6, 3, 5, 4 };
                                          ^
                                       // n
    


1 commentaires

Merci beaucoup. Le rend beaucoup plus incompréhensible



3
votes

Tout d'abord, rappelez-vous qu'en C, l'indexation des tableaux est commutative - a [i] et i [a] donnent le même résultat.

Donc, la ligne

printf("mess: %d\n", n[-6]); //value: 32766

équivaut à écrire

printf("mess: %d\n", (-2)[n]); //value: 1

Le suffixe [] code> a une priorité plus élevée que l'opérateur unaire - , donc l'expression -2 [n] est analysée comme - (2 [n]) code >. Vous indexez 2 éléments de n (3) et annulez le résultat.

Dans la ligne suivante,

printf( "mess: %d\n", -n[2] );

l'expression (-2) [n] équivaut à n [-2] - vous indexez 2 éléments avant n , ce qui vous donne 1.

Dans la ligne

printf("mess: %d\n", -2[n]); //value: -3

vous essayez d'indexer 6 éléments avant n ; malheureusement, c'est en dehors des limites de votre tableau. À ce stade, le comportement n'est pas défini. Vous pourriez obtenir une sortie de déchets, le blocage de votre code ou autre chose pourrait se produire.


0 commentaires