Maison  >  Article  >  développement back-end  >  Quelle est la différence entre sizeof et strlen en langage C

Quelle est la différence entre sizeof et strlen en langage C

王林
王林original
2020-11-20 10:04:188121parcourir

La différence entre sizeof et strlen en langage C est la suivante : strlen est une fonction utilisée pour calculer la longueur de la chaîne spécifiée str, mais n'inclut pas le caractère de fin (c'est-à-dire le caractère nul) et sizeof est un unaire ; opérateur, pas une fonction.

Quelle est la différence entre sizeof et strlen en langage C

Analyse des différences :

strlen est une fonction qui est utilisée pour calculer la longueur de la chaîne spécifiée str, mais n'inclut pas la fin caractère (c'est-à-dire caractère nul). Son prototype est affiché dans le code suivant :

size_t strlen(char const* str);

Comme strlen est une fonction, un appel de fonction est requis. L'exemple d'appel est tel qu'indiqué dans le code suivant :

char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));
<.>Évidemment, le résultat de l'exemple de code ci-dessus est 6 (car le caractère de fin null n'est pas inclus). Ce qui nécessite une attention particulière ici, c'est que la fonction strlen renvoie une valeur de type size_t, ce qui peut amener le programme à provoquer des résultats inattendus, comme le montre l'exemple de code suivant :


/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}

Depuis la surface, il semble que les deux expressions de jugement ci-dessus sont complètement égales, mais ce n'est pas le cas en réalité. Parmi eux, il n'y a rien de mal à juger l'expression un, et le programme peut fonctionner exactement comme prévu ; mais le résultat du jugement de l'expression deux sera toujours vrai.

La raison est simple, car le résultat de retour de la fonction strlen est de type size_t (c'est-à-dire un type entier non signé), et le type size_t ne peut jamais être négatif. Par conséquent, l'instruction "if(strlen(x)-strlen(y)>=0)" sera toujours vraie.

De même, même si l'expression contient à la fois des entiers signés et des entiers non signés, des résultats inattendus peuvent toujours se produire, comme le montre le code suivant :

/*判断一*/
if(strlen(x)>= 5)
{
}
/*判断二*/
if(strlen(x)- 5>=0)
{
}

Évidemment, le jugement Le résultat de l'expression 2 est toujours vrai pour la même raison que ci-dessus.

Le mot-clé sizeof est un opérateur unaire, pas une fonction. Différent de la fonction strlen, ses paramètres peuvent être des tableaux, des pointeurs, des types, des objets, des fonctions, etc., comme le montre l'exemple de code suivant :


char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));

Par rapport à la fonction strlen, voici le Le résultat de l'exécution de l'exemple de code est 7 (car il inclut le caractère nul de fin). En même temps, pour sizeof, comme le tampon a été initialisé avec une chaîne connue, sa longueur est fixe, donc sizeof calcule la longueur du tampon au moment de la compilation. C'est précisément parce qu'il est calculé au moment de la compilation que sizeof ne peut pas être utilisé pour renvoyer la taille de l'espace mémoire alloué dynamiquement.


Recommandations associées :

Tutoriel graphique de développement C#.Net

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Articles Liés

Voir plus