Vous avez votre tableau en mémoire comme si:
2, 23, 6, 7, 8...
Qu'est-ce que cela n'est transtyper le tableau un char*
, qui vous permet d'accéder à des octets individuels, et points ici:
2, 23, 6, 7, 8...
^
il ajoute quatre octets, en le déplaçant vers la valeur suivante (voir plus plus tard).
2, 23, 6, 7, 8...
^
Ensuite, il se transforme en un int*
et déréférence il, obtenir la valeur 23.
Il y a trois choses techniquement mal avec ce code.
La première est qu'il suppose qu'un unsigned
a une taille de 4 octets. (D'où le + 4
). Mais ce n'est pas nécessairement vrai! Mieux aurait été + sizeof(unsigned)
, assurant l'exactitude, peu importe quelle taille unsigned
se trouve être.
Le deuxième problème est le cast à int
: le tableau original était unsigned
, mais la valeur est en train d'être convertie en int
. Il existe des valeurs dans la plage unsigned
que int
ne peut pas représenter (car dans un int
la moitié de la plage est dans les négatifs.) Donc, si l'une des valeurs dans le tableau n'était pas représentable comme int
(signifiant que la valeur était supérieure à INT_MAX
) , vous obtiendriez la mauvaise valeur. Mieux serait de convertir en unsigned*
, pour maintenir le bon type.
La dernière chose est le spécificateur de format. Le spécificateur pour les entiers est %d
, mais le code utilise %u
, qui est pour les entiers non signés. En effet, même si le renvoi à int*
était erroné, printf
va convertir cette valeur en unsigned*
, en restaurant son intégrité. En corrigeant le problème deux, le problème trois se corrige lui-même.
Il ya un caché quatrième problème: Le code est nul. Cela peut être à des fins d'apprentissage, mais beurk.
Oui, c'était une faute de frappe: | –
J'ai édité l'extrait après avoir lu le message de GMan :) –
Merci, mais je ne ferais pas cela. :) Il confond les gens et invalide les réponses que nous avons données. Gardez la question comment elle était afin que tout continue à avoir du sens, et ainsi les passants peuvent tirer pleinement parti de la question. EDIT: Beaucoup mieux. :) – GManNickG