2016-11-18 1 views
0

Il existe un tableau arr avec une mémoire allouée pour deux short s (4 octets au total). Ensuite, je remplis ces deux éléments avec ffff et eeee en conséquence. Après que j'essaie d'itérer sur la même mémoire allouée comme elle a été allouée pour 4 char s (aussi 4 octets au total, mais maintenant je suppose être capable de rechercher des éléments par 1 octet). Comme vous pouvez le voir à la sortie, il ne montre pas ce que je m'attends (obtenir le même 0xeeeeffff divisé en 4 éléments distincts). Quel est le problème avec le code?Comment itérer sur un tableau en interprétant son élément comme un type différent?

short *arr = malloc(sizeof(short) * 2); 
    *arr = 0xeeee; 
    *(arr + 1) = 0xffff; 
    printf("%p\n", &arr[0]); 
    printf("%p\n", &arr[1]); 
    // convert 
    char * cnv = (char *)arr; 
    printf("=======\n"); 
    for (int i = 0; i < 4; i++) { 
    printf("%p\n", cnv); 
    printf("%x\n", *cnv); 
    cnv++; 
    } 

La sortie:

0x759010 
0x759012 
======= 
0x759010 
ffffffee # expect 'ee' 
0x759011 
ffffffee # expect 'ee' 
0x759012 
ffffffff # expect 'ff' 
0x759013 
ffffffff # expect 'ff' 
+1

'short' et' char' passés à printf via '...' sont passés comme 'int's. C'est comme ça que ça fonctionne ... Vous devez utiliser '"% hhx "' pour interpréter ce 'int' comme un caractère (dans gcc de toute façon). – Arkadiy

Répondre

1

%x attend un unsigned int, pas char, et donc votre programme a un comportement non défini. Vous avez besoin de %hhx.

+1

[Démo avec plusieurs correctifs] (https://ideone.com/abZOVz) –

+0

Pourquoi avez-vous lancé le pointeur (unsigned short *) à (void *) ici 'printf ("% p \ n ", (void *) & arr [0]); –

+0

@TimurFayzrakhmanov: Parce que c'est ainsi que 'printf' fonctionne. Votre code d'origine a un comportement indéfini. Voir le manuel. –

2

Il semble que char est signé le type de votre plate-forme. L'hex 0xee est traité comme un nombre négatif (-18). Lorsque ce nombre est promu en nombre entier, sa représentation binaire est telle qu'elle est 0xffffffee en hexadécimal.

La même chose se produit avec 0xff.

Si vous l'imprimez en utilisant %d, vous pouvez voir la valeur négative dans la sortie.

printf("%x %d\n", *cnv, *cnv);