Maison > développement back-end > C++ > le corps du texte

Pourquoi `strlen()` et `sizeof()` renvoient-ils des résultats différents pour l'initialisation de chaîne en C ?

DDD
Libérer: 2024-11-04 00:21:30
original
871 Les gens l'ont consulté

Why do `strlen()` and `sizeof()` return different results for string initialization in C?

Comprendre la différence entre les résultats strlen() et sizeof() pour l'initialisation de chaîne

En programmation C, il y a souvent une différence entre les résultats de strlen() et sizeof() lorsqu'il s'agit de pointeurs et de tableaux initialisés en chaînes. Ce comportement apparemment contradictoire peut s'expliquer en comprenant la nature des pointeurs et des tableaux.

Considérez l'exemple de code fourni :

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>
Copier après la connexion

Le résultat de ce code est :

7 4
7 8
Copier après la connexion

Les différents résultats pour strlen() et sizeof() proviennent du fait que str1 est un pointeur vers une chaîne tandis que str2 est un tableau de caractères.

Sizeof() vs Strlen( ) pour les pointeurs

sizeof() détermine la taille du type de données en octets. Dans le cas d'un pointeur char, tel que str1, sizeof renvoie 4 sur un système 32 bits (8 sur un système 64 bits) car un pointeur occupe 4 (ou 8) octets de mémoire. Cependant, strlen renvoie la longueur de la chaîne pointée par le pointeur de caractère. Puisque la chaîne "Sanjeev" comporte 7 caractères, strlen renvoie 7.

Sizeof() vs Strlen() pour les tableaux

En revanche, str2 est un tableau de personnages. sizeof(str2) renvoie la taille de l'ensemble du tableau, qui inclut à la fois les caractères et le terminateur nul (ajouté automatiquement à toutes les chaînes C). Par conséquent, sizeof(str2) renvoie 8 (le nombre de caractères dans "Sanjeev" plus le terminateur nul). strlen(str2) renvoie également 7, qui est la longueur de la chaîne à l'exclusion du terminateur nul.

Considérations supplémentaires

Pour illustrer davantage la différence, considérez ce qui suit code :

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>
Copier après la connexion

Dans ce cas, str1 est désormais un pointeur qui pointe vers le début du tableau de caractères str2. Comme auparavant, strlen(str1) renvoie 7 et sizeof(str1) renvoie 4. Cependant, strlen(str2) renvoie également 7, tandis que sizeof(str2) renvoie toujours 8. En effet, str2 reste un tableau et la taille d'un tableau est déterminé par le nombre d'éléments qu'il contient, qu'ils soient réellement utilisés ou non.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal