Tout d'abord, vous êtes à la coulée de l'individu adresses int
s. Je ne pense pas que ce soit une bonne idée. un int
est garanti pour au moins 2 octets ou plus en taille, une adresse/pointeur est généralement de 4 ou 8 octets. Casting ces int
n'a tout simplement pas de s'asseoir droit. Si je devais jeter à rien, je serais probablement utiliser unsigned long
pour les systèmes 32 bit, et unsigned long long
64 bits. Je voudrais utiliser ce dernier pour être sûr.
Cela dit, je ne jette pas les adresses de tous, et il suffit d'utiliser l' offsetof
macro.
Ajouter #include <stddef.h>
à votre fichier, et l'utilisation de l' offsetof
macro, qui jette la valeur de décalage d' size_t
type, pas un int
, vous l'esprit. Il fonctionne simplement par l'utilisation de 0 que l'adresse mémoire de la structure, et ensuite renvoie l'adresse de la donnée membre, donnant le décalage réel:
size_t offset = offsetoff(T1, c);
//struct, member
Comme Zack a souligné dans son commentaire, la prochaine partie de la réponse est un peu hors de propos, mais pour les liens qu'il contient, et à des fins d'exhaustivité, je vais juste le laisser ici - que offsetof
est exigée pour toutes les implémentations:
Définir la macro-vous, si vous n'avez pas stddef.h pour une raison quelconque, comme suit:
#ifndef offsetof
#define offsetof(s, m) ((size_t)&(((s *) 0)->m))
#endif
Que devrait faire l'affaire, mais méfiez-vous: si votre compilateur n'a pas vous fournir avec un offsetof
-contenant en-tête, qui peut être parce qu'il peut invoquer un comportement indéterminé.
J'ai pris l' offsetof
définition ci-dessus de la stddef.h source que j'ai trouvé ici, de sorte que vous pouvez il suffit de télécharger ce fichier, et de l'utiliser, au lieu de définir la macro dans votre propre fichier, mais gardez à l'esprit que l' offsetof
vous utilisez n'est pas fiable à 100%.
Note:
Comme pmr signalé hors de moi, et comme je l'ai expliqué ensuite (ou au moins, essayé de l'expliquer), il s'avère offsetof
n'est pas infaillible. Toutefois, si vous utilisez gcc, il met en œuvre ses propres __builtin_offsetof
, donc:
#ifndef offsetof
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
#endif
doit être sûr à utiliser. GCC devrait venir avec un stddef.h
de toute façon, de sorte que vous pouvez supprimer l' #define
de toute façon. Et, comme l'explique l'un des sites les réponses, GCC préféreront toujours l'utilisation de son propre, natif offsetof
à la vôtre.
De toute façon, c'est assez pour le moment, plus d'infos sur Google, mais voici quelques liens: