2010-11-16 9 views
2

Doublons possibles:
Are there are any platforms where pointers to different types have different sizes?
are all data pointers of the same size in one platform?Sont des pointeurs de la même taille?

sizeof(Bucket *) est le même que sizeof(int *), non?

BTW, est char arr[]; valide dans c90?

+1

Dup de [Existe-t-il des plateformes où les pointeurs vers différents types ont des tailles différentes?] (Http://stackoverflow.com/questions/916051/are-there-are-any-platforms-where-pointers-to- different-types-have-different-size), [La taille des pointeurs peut-elle varier en fonction de ce qui est pointé?] (http://stackoverflow.com/questions/1473935/can-the-size-of-pointers-vary- En fonction de ce qui est pointé vers) – outis

+1

vous devez diviser en deux questions afin qu'ils puissent être bien répondu séparément –

+0

Dupliquer de [sont tous les pointeurs de données de la même taille dans une plate-forme?] (http: // stackoverflow. com/questions/1241205/are-all-data-pointeurs-de-la-même-taille-dans-une-plate-forme) –

Répondre

2

Original post:

Oui, c'est vrai. Les pointeurs sont du type .

Mais, c'est faux. J'ai tiré trop vite! Je suis désolé pour ça. Certains «cas» de différentes tailles de pointeurs existent, dépendent de la plateforme et dépendent également du type: Jetez un oeil à http://c-faq.com/ptrs/generic.html et http://c-faq.com/null/machexamp.html pour des exemples ou au moins des explications générales. (Merci beaucoup @fmark et @paxdiablo, j'ai aussi appris quelque chose). Cependant, je n'ai jamais eu une situation où les pointeurs n'étaient pas de la même taille (heureusement/malheureusement?).

+0

BTW, est char arr []; valable en c90? – arr

+0

C'est correct mais la taille du pointeur dépend de la plateforme –

+2

Vraiment? Aimeriez-vous citer votre source pour cette affirmation ("les pointeurs sont de la même taille")? Comme dans: quel bit de la norme ISO impose-t-il cela? – paxdiablo

4

Je crois qu'il n'est pas nécessaire que les pointeurs aient tous la même taille. La seule exigence est que tous les pointeurs d'objet peuvent être stockés dans void *, que lorsqu'ils sont transtypés en void * et inversement, ils seront identiques, et que tous les pointeurs de fonction, s'ils sont lancés sur un autre type de pointeur de fonction et reviennent, seront identiques . (Je ne suis pas sûr que les pointeurs de fonction de coulée soient void *.)

En pratique, je pense que la seule fois où vous trouverez des pointeurs de différentes tailles est si vous vous souciez des pointeurs de fonctions membres du C++, ou vous travaillez sur une architecture plus obscure.

En C90, char arr[]; est un moyen valide de pré-déclarer un tableau global de longueur à déterminer. Notez que char arr[] est un type incomplet, vous devez donc le déclarer avant de pouvoir utiliser sizeof. Ce n'est pas valide comme c'est le cas en C99, pour faire des membres de tableau flexibles.

+0

-1 Encore une fois, incorrect. Voir http://c-faq.com/ptrs/generic.html – fmark

+1

Je pense que -1 pour un libellé peu clair est un peu dur. J'ai honnêtement oublié tout sur les pointeurs de fonction jusqu'au deuxième paragraphe de ma réponse, donc je n'ai pas pensé à faire la distinction plus tôt, d'autant plus que l'OP ne semblait pas particulièrement intéressé par les pointeurs de fonction. –

+0

Est-ce que 'char arr [];' est valide en c89? – arr

Questions connexes