web-dev-qa-db-fra.com

taille du tableau de caractères et taille du pointeur de caractères

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?

17
user2416871

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.

25
alk

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.

6
Yu Hao

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.

3
gkovacs90

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.

2
Leigh

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).

2
caf