Sizeof vs Strlen

#include "stdio.h" #include "ssortingng.h" main() { char ssortingng[] = "october"; // october is 7 letters strcpy(ssortingng, "september"); // september is 9 letters printf("the size of %s is %d and the length is %d\n\n", ssortingng, sizeof(ssortingng), strlen(ssortingng)); return 0; } 

Sortie:

la taille de septembre est de 8 et la longueur est de 9

Y a-t-il quelque chose qui ne va pas avec ma syntaxe ou quoi?

    sizeof et strlen() font des choses différentes. Dans ce cas, votre déclaration

     char ssortingng[] = "october"; 

    est le même que

     char ssortingng[8] = "october"; 

    le compilateur peut donc dire que la taille de la ssortingng est 8. Il le fait au moment de la compilation.

    Cependant, strlen() compte le nombre de caractères de la chaîne au moment de l’exécution. Donc, après avoir appelé strcpy() , la ssortingng contient maintenant “septembre”. strlen() compte les caractères et en trouve 9. Notez que vous n’avez pas alloué suffisamment d’espace pour que la ssortingng “septembre”. C’est un comportement indéfini.

    La sortie est correcte car

    la taille de la première chaîne de déclaration a été allouée par le compilateur qui est 7 + 1 (octobre est de 7 octets et 1 octet pour le terminateur nul au moment de la compilation)

    Deuxième déclaration: vous copiez le mois de septembre (chaîne de 9 octets à 8 octets);

    là vous avez la taille de septembre comme 8 octets (toujours strlen() ne fonctionnera pas pour septembre il n’a pas de caractère nul)

    Votre tableau de destination est de 8 octets (longueur “octobre” plus \ 0) et vous voulez mettre 9 caractères dans ce tableau.

    man strcpy dit: Si la chaîne de destination d’un strcpy () n’est pas assez grande, alors tout peut arriver.

    S’il vous plaît dites-moi ce que vous voulez vraiment faire, car cela sent mauvais long chemin

    Vous devez éliminer le problème de dépassement de tampon dans cet exemple. Une façon de faire est d’utiliser strncpy :

     memset(ssortingng, 0, sizeof(ssortingng)); strncpy(ssortingng, "september", sizeof(ssortingng)-1);