Comment sizeof () fonctionne-t-il avec char * (variables pointeur)?

J’ai un code C:

char s1[20]; char *s = "fyc"; printf("%d %d\n", sizeof(s1), sizeof(s)); return 0; 

Il retourne

 20 8 

Je me demande comment vient le 8, merci!

sizeof(s1) est la taille du tableau en mémoire, dans votre cas, 20 caractères, chaque octet étant égal à 1 octet, est égal à 20.

sizeof(s) est la taille du pointeur. Sur différentes machines, la taille peut être différente. Sur le mien c’est 4.

Pour tester différentes tailles de caractères sur votre machine, vous pouvez simplement passer le type à la place d’une variable telle que so printf("%zu %zu\n", sizeof(char*), sizeof(char[20])); .

Il imprimera 4 et 20 respectivement sur une machine 32 bits.

sizeof(char *) est la taille du pointeur, donc normalement 4 pour une machine 32 bits et 8 pour une machine 64 bits.

La taille d’un tableau, en revanche, renvoie la taille du tableau, dans ce cas, 20 * sizeof (char) = 20

Une dernière chose, vous devez utiliser %zu pour le type size_t au format printf .

 printf("%zu %zu\n", sizeof(s1), sizeof(s)); 

8 est la taille d’un pointeur, une adresse. Sur une machine 64 bits, il a 8 octets.

L’opérateur sizeof renvoie la taille d’un type . L’opérande de sizeof peut être soit le nom entre parenthèses d’un type, soit une expression, mais dans tous les cas, la taille est déterminée à partir du type de l’opérande uniquement.

sizeof s1 est donc ssortingctement équivalent à sizeof (char[20]) et renvoie 20 .

sizeof s est ssortingctement équivalent à sizeof (char*) et renvoie la taille d’un pointeur sur char ( 64 bits dans votre cas).

Si vous voulez que la longueur de la chaîne C soit indiquée par s , vous pouvez utiliser strlen(s) .

Si vous êtes sur un ordinateur 64 bits, les adresses mémoire sont 64 bits. Par conséquent, une valeur numérique 64 bits (8 octets x 8 bits par octet) doit être utilisée pour représenter la variable de pointeur numérique (char *).

En d’autres termes, sizeof () fonctionne de la même manière pour les pointeurs que pour les variables standard. Il vous suffit de prendre en compte la plate-forme cible lors de l’utilisation de pointeurs.