Identifier le type de données d’une valeur en mémoire en C?

Comment un programme / une application sait-il que les données d’une adresse mémoire sont d’un certain type de données?

Par exemple, supposons qu’il y ait int a; et supposons que la variable a soit stockée dans l’adresse 0x100 . Où sont les informations stockées qui dit qu’il est de type int ?

Dans des langues telles que C, les informations sont toujours “stockées” dans la façon dont vous interprétez les données . Une certaine gentillesse est ajoutée par le compilateur qui comprend dans une certaine mesure les types de vos variables et tente d’empêcher des opérations qui n’ont pas de sens.

Par exemple, supposons que vous ayez les bits: 0xFFFFFFFF . Si vous les interprétez comme “un 32b unsigned int”, vous obtiendrez 4294967295 . Si vous les interprétez comme “un 32b signé int”, vous obtenez -1 (*) . Si vous les interprétez comme un double, Dieu sait ce que vous obtiendrez.

Nulle part, c’est juste supposé par le code.

L’application AC ne stocke pas les informations de type. La seule application concerne l’utilisation des données. Et, en C, il est très simple d’abuser de cette application.

Considérer ce qui suit:

 short s; short *p = &s; *(long*)p = 0; 

Ce code prend un pointeur sur une variable courte, puis écrit sur cette variable comme si elle était longue. Cela écrase la mémoire au-delà de ce qui appartient à la variable utilisée, ce qui provoque un comportement indéfini.

Cette information n’est pas stockée. Par exemple, vous pourriez faire des choses comme

 int i=15; char *p=(char*)&i; char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0 

Mais ne faites pas ceci à moins de savoir vraiment ce que vous faites. Faire des choses comme ça sans se soucier est un moyen courant d’erreurs.

Lorsque le programme C a terminé la liaison et qu’il n’est pas nécessaire d’exposer de symboles en dehors, ces données n’existent plus.

Les types de données sont liés à la langue, lorsque l’exécutable est prêt, la langue ne joue plus aucun rôle, comme c’est maintenant la mémoire et le processeur.