44 votes

Sizeof vs Strlen

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char string[] = "october"; // 7 letters

    strcpy(string, "september"); // 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string,
        sizeof(string), strlen(string));

    return 0;
}

Sortir:

 $ ./a.out
the size of september is 8 and the length is 9

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

2voto

Praveen.thota Points 11

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 null au moment de la compilation)

Deuxième instruction : vous copiez September (chaîne de 9 octets à 8 octets) ;

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

1voto

ola1olsson Points 155

Votre tableau de destination est de 8 octets (longueur de "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 te plaît, dis-moi ce que tu veux vraiment faire, parce que ça sent mauvais depuis longtemps

-1voto

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X