8
votes

Est-il prudent de supposer qu'un pointeur est la taille d'un int en C?

Dans la conception d'un nouveau langage de programmation, il est-il sûr de supposer qu'un INT C et un pointeur sont de la même taille sur la machine?


3 commentaires

Probablement une question de dépassement de pile.


Voir aussi: C ++: est-il sûr de lancer un pointeur sur INT et plus tard à nouveau au pointeur?


Dupliqué possible de Tailleof (int) == Taillef (NOID *)?


7 Réponses :


2
votes

Non, mais un pointeur doit avoir la même taille qu'un intPTR_T.


4 commentaires

Il semble que la taille de (int)! = Tailleof (int *) avec la machine et le compilateur que j'utilise pour le moment ... Donc, si quelque chose de similaire est sûr, cela n'implique pas.


@ user9521: Comme Dan dit, utilisez toujours les types taille_t . La principale question avec la conversion du code en X64 est la prévalence des personnes qui assumant la taille de l'intensité sont identiques, cette pratique a été obsolète il y a de nombreuses années.


-1 - De facto Vous êtes probablement correct, mais de jure vous avez tort. Sur les architectures de mémoire segmentées (et autres types d'agents pathologiques), Taille_T peut être plus petite que INTPTR_T. Stackoverflow.com/Questtions/1464174/size-t-vs-intptr-t .


Techniquement, votre réponse est toujours erronée même après la modification. Un intPTR_T peut stocker en toute sécurité un pointeur , ce qui signifie c'est au moins aussi grand . Lorsque tailleof (int) == taille de (vide *), il s'agit généralement d'une taille de taille (intPTR_T). Mais je ne crois pas qu'il y ait une exigence si la taille de (int) <= sizeof (vide *), ni une exigence de taille de (intPTR_T) = max (taille de taille (vide *), taille de (int)).



1
votes

Je pense que vous voulez dire la taille des types de données tels que définis par la plate-forme non C Lang. Au mieux de mes connaissances C ne définit aucune taille spécifique pour les types de données. La réponse à votre question est que vous ne pouvez pas supposer cela, par exemple sur Win32 Tailleof (int) == Tailleof (pointeur) == 4 octets Toutefois sur Win64 Tailleof (int) == 4 et Tailleof (pointeur) == 8 < / p>


4 commentaires

Le langage C définit plusieurs tailles de données minimales (par exemple Taille_t doit être d'au moins 16 bits), la taille relationnelle (longtemps ne peut pas être plus courte que courte), ainsi que certains types de taille fixe (UINT32_T correspond exactement à 32 bits).


@Joe Vous avez raison, j'aurais dû limiter ma réponse à la taille relative de l'INT et du pointeur.


@Joe: Il semble que uint32_t d'abord apparu dans la norme C en C99 (voir EN.Wikipedia. org / wiki / stdint.h ) parce que c'est quand STDINT.H est devenu une partie de la norme. (Je ne sais pas si les implémentations le fourniraient parfois avant C99.)


@ COMCOMMAN: Auparavant, la plupart des implémentations définiraient généralement des types d'entier qui avaient des tailles fixes; Mais comme ce n'est pas portable, de nombreux projets ont leurs propres moyens de les définir, en utilisant généralement Autoconf pour les définir aux équivalents corrects pour obtenir la taille de la taille du compilateur actuel. Vous pouvez compiler et exécuter un petit programme C pour vous indiquer la taille de (abrégée), la taille de (int), etc., puis utilisez le résultat pour écrire un fichier d'en-tête qui contient les Typefs appropriés pour INT16, INT32, etc.



4
votes

Non, surtout dans les environnements 64 bits:

LP64 Ceci couvre les environnements * Nix mais la même chose est vraie dans Windows pour LLP64.


0 commentaires

5
votes

Non, pas du tout. De nombreux compilateurs ne les ont pas comme la même taille.


0 commentaires

18
votes

non. Un pointeur peut être plus grand ou plus petit qu'un entier de taille. Si vous avez besoin de passer un pointeur comme un entier pour une raison quelconque (comme un entier, plutôt que du pointeur, de l'arithmétique), ils sont garantis dans un intPTR_T .

Ils ne sont pas garantis dans une taille_t comme suggéré dans une autre réponse, mais dans la pratique, il est peu probable qu'ils ne le feront pas, car la plus grande taille adressable est généralement égale à la plus grande adresse adressable.


0 commentaires

1
votes

non; sur mes macos x 10.6.5. Machine, un int est de 32 bits et un pointeur est de 64 bits par défaut.

Si vous avez besoin d'un entier, c'est aussi la bonne taille pour contenir un pointeur également, utilisez #include (ou ) et < code> uintptr_t - en supposant que vous avez un support C99, ou pouvez le simuler.


0 commentaires

-2
votes

Je crois que le noyau Linux passe les pointeurs comme non signé longtemps. Ils sont garantis d'au moins la même taille qu'un pointeur :)


2 commentaires

N ° Linux garantit qu'ils ont la même taille. Le langage C ne fait aucune promesse.


C'est en fait une bonne réponse car elle montre un comportement du noyau et leur mépris des règles du langage C. Il provoque des bugs dans la vie réelle, comme l'openssl's Bug 4441: via C7-D Processor: Accrochez-vous dans 30-Test_afalg.t . Il semble être dû au fait que le noyau coulait des pointeurs (I686, 32 bits) aux intégrales de taille plus grande (non signé longtemps, puis stockée dans un __ u64 ).