2017-10-15 6 views
-1
#include <stdio.h> 
int main(void) 
{ 
    short x[12]; 
    unsigned char *cp; 
    short *sp; 
    int *ip; 
    int i; 
    for (i = 0; i < 12; i++) { 
    x[i] = i + 1; 
    } 
    cp = (unsigned char *) x; 
    sp = (short *) x; 
    ip = (int *) x; 
    printf("1)*cp = %x\n",*cp); 
    printf("A)*ip = %x\n",*ip); 
    ip = ip + 2; 
    printf("B)*ip = %x\n",*ip); 
    cp[1]--; 
    printf("C) cp[1] = %d\n", cp[1]); 
    printf("D)*sp = %d\n",*sp); 
    sp[3] = sp[3] + 257; 
    printf("E) cp[6] = %x\n", cp[6]); 
    printf("F) cp[7] = %x\n", cp[7]); 
return 0; 
} 

Ce code produit la sortie suivanteSortie C Pointeurs Pas clair

1)*cp = 1 
A)*ip = 20001 
B)*ip = 60005 
C) cp[1] = 255 
D)*sp = -255 
E) cp[6] = 5 
F) cp[7] = 1 

Am sûr de la logique derrière tout cela. Est-ce que char non signé a besoin de quelque chose à faire avec la sortie. Je ne comprends pas pourquoi 20001 est sortie par pointeur entier ip et comment cp [6] est 5

+0

[Quelle est la règle stricte d'aliasing et comment la contourner] (https://stackoverflow.com/q/98650/995714) –

Répondre

1

*ip causes undefined behaviour cause de la violation de la règle stricte aliasing. Vous ne pouvez pas utiliser une valeur lvalue de type int pour accéder à la mémoire déclarée short. Comme le comportement n'est pas défini, la sortie entière du programme n'a pas de sens, vous ne devriez donc pas vous inquiéter de savoir pourquoi une sortie particulière s'est produite.