J'ai un morceau de code C et je ne comprends pas comment fonctionne la fonction sizeof(...)
:
#include <stdio.h>
int main(){
const char firstname[] = "bobby";
const char* lastname = "eraserhead";
printf("%lu\n", sizeof(firstname) + sizeof(lastname));
return 0;
}
Dans le code ci-dessus, sizeof (prénom) est 6 et sizeof (nom) est 8.
Mais bobby
fait 5 caractères de large et eraserhead
fait 11 de large. Je m'attends à 16
.
Pourquoi sizeof se comporte-t-il différemment pour le tableau de caractères et le pointeur sur le caractère?
Quelqu'un peut-il clarifier?
firstname
est un tableau char
portant un terminateur 0
final. lastname
est un pointeur. Sur un système 64 bits, les pointeurs ont une largeur de 8 octets.
sizeof
un tableau est la taille du tableau total, dans le cas de "bobby", c'est 5 caractères et un à la fin \0
ce qui équivaut à 6.
sizeof
un pointeur est la taille du pointeur, qui est normalement de 4 octets sur une machine 32 bits et de 8 octets sur une machine 64 bits.
La taille de votre premier tableau est la taille de bobby\0
. \0
est le caractère de terminaison, c'est donc 6.
La deuxième taille est la taille d'un pointeur, qui est de 8 octets dans votre système 64 bits. Sa taille ne dépend pas de la longueur de la chaîne attribuée.
firstname[]
Se termine par null, ce qui ajoute 1 à la longueur.
sizeof(lastname)
donne la taille du pointeur au lieu de la valeur réelle.
firstname
est un tableau de 6 chars
, y compris la terminaison '\0'
caractère à la fin de la chaîne. C'est pourquoi sizeof firstname
est 6.
lastname
est un pointeur sur char
, et aura la taille d'un tel pointeur sur votre système. Les valeurs typiques sont 4 et 8. La taille de lastname
sera la même, peu importe ce vers quoi elle pointe (ou même si elle ne pointe vers rien du tout).