Pour une architecture donnée, la taille d’un pointeur est-elle toujours la même comme semble le montrer l’exemple ci-dessous ?
#include<stdio.h>intmain(void){
int a = (int) sizeof(void*);
int b = (int) sizeof(char*);
int c = (int) sizeof(longunsignedint*);
int d = (int) sizeof(FILE*);
// Tailles : 8, 8, 8, 8printf("Tailles : %d, %d, %d, %d", a, b, c, d);
return0;
}
Si oui, peut-on en déduire qu’il est toujours possible de convertir un pointeur vers void* ?
Sur un processeur x86_64, cette affirmation est exacte, y compris pour les pointeurs de fonctions. Toutefois, comme te l’a précisé @Ksass`Peuk, du point de vue de la norme, c’est une autre histoire.
Pour les pointeurs sur des objets (autrement dit, tous sauf les pointeurs de fonctions), seule la conversion vers et depuis un pointeur sur void ou un pointeur sur char est garantie.
Pour les pointeurs de fonctions, comme expliqué dans le lien que t’a fourni @Ksass`Peuk, seule la conversion vers un autre pointeur de fonction est garantie (note bien seulement la conversion, pas son utilisation).
Sur un processeur x86_64, cette affirmation est exacte, y compris pour les pointeurs de fonctions. Toutefois, comme te l’a précisé @Ksass`Peuk, du point de vue de la norme, c’est une autre histoire.
C’est la norme POSIX qui garantie ça en particulier.
Mmm… La norme POSIX ne définit-elle pas plutôt des interfaces et des commandes ? Je ne pense pas qu’elle étende le standard C, en tous les cas pas concernant le langage en lui-même (la bilbiothèque standard est en revanche enrichie).
/* According to the ISO C standard, casting between function
pointers and'void *', as done above, produces undefined results.
POSIX.1-2003and POSIX.1-2008 accepted this state of affairs and
proposed the following workaround:
*(void **) (&cosine) = dlsym(handle, "cos");
This (clumsy) cast conforms with the ISO C standard and will
avoid any compiler warnings.
The 2013 Technical Corrigendum to POSIX.1-2008 (a.k.a.
POSIX.1-2013) improved matters by requiring that conforming
implementations support casting 'void *'to a function pointer.
Nevertheless, some compilers (e.g., gcc with the '-pedantic'option) may complain about the cast used in this program. */
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte