la taille et la longueur des caractères ne sont pas identiques

Je viens tout juste d’apprendre le C après quelques années d’expérience en Python, C # et Java.

J’ai appris dans un tutoriel que char anything[] qui est char anything[] est toujours un pointeur. (Aujourd’hui, quelqu’un m’a dit que c’était faux) – Je pense que ma question a quelque chose à voir avec cela. Néanmoins, j’essaie d’obtenir la longueur d’un tableau de caractères:

 #include  int get_ssortingng_length(char * ssortingng) { int length = 0; while(ssortingng[length] != '\0') { char c = ssortingng[length]; length++; } return length; } int get_ssortingng_size(char * ssortingng) { return sizeof(ssortingng); } int main() { printf("%d\n", get_ssortingng_size("hello world")); // returns 8 printf("%d\n", get_ssortingng_length("hello world")); // returns 11 printf("%d\n", sizeof("hello world")); // returns 12 -> Okay, because of '\0'-char return 0; } 

résultat:

8

11

12

alors, pourquoi ma get_ssortingng_size get_ssortingng_size renvoie-t-elle 8 au lieu de 12? (Puisque les deux appellent seulement sizeof() )

char anything[] est un pointeur? Pas assez.

Le type réel du littéral "hello world" est un caractère const char[12] . (Notez l’élément supplémentaire pour le terminateur NUL).

Mais lorsqu’il est passé à une fonction, ce type se décompose en un const char* .

Donc get_ssortingng_size retourne sizeof(const char*) qui est 8 sur votre plate-forme (c’est-à-dire la taille d’un caractère char* ), mais sizeof("hello world") est sizeof(const char[12]) qui est sizeof (char) 12, puisque sizeof (char) est défini par le standard C comme étant 1.

get_ssortingng_length renvoie la position du premier terminateur NUL à partir du pointeur qui lui a été transmis.

Enfin, notez que vous devez utiliser %zu comme spécificateur de format pour le type de retour sizeof : techniquement, le comportement de printf("%d\n", sizeof("hello world")); est indéfini .

Utilisez toujours strlen () pour déterminer la longueur d’une chaîne.

Utiliser sizeof () pour la longueur de la chaîne est dangereux et doit être évité. sizeof () renvoie la taille du type donné, et dans ce cas, le type donné est un pointeur (votre système doit être de 64 bits, car sa taille est de 8).

Considérez ce code et sa sortie:

 char ssortingng[] = "This is a test"; char *pointer = ssortingng; printf("sizeof ssortingng: %zu\n", sizeof(ssortingng)); printf("sizeof pointer: %zu\n", sizeof(pointer)); printf("strlen pointer: %zu\n", strlen(pointer)); sizeof ssortingng: 15 sizeof pointer: 8 strlen pointer: 14 

Cela ne fait pas ce que vous pensez:

 int get_ssortingng_size(char * ssortingng) { return sizeof(ssortingng); } 

Ici sizeof(ssortingng) est la taille du pointeur, qui est toujours 8 sur votre plate-forme (supposément 64 bits). Sur une plate-forme 32 bits, il est fort probable que 4 au lieu de 8.

Par ailleurs, sizeof("hello world") correspond à la taille de la mémoire prise par le littéral "hello world" , qui est égal à 11 + 1 (+1 pour le terminateur NUL).