Maison > développement back-end > C++ > Pourquoi `strlen` et `sizeof` renvoient-ils des valeurs différentes pour l'initialisation de chaîne basée sur un pointeur et un tableau en C ?

Pourquoi `strlen` et `sizeof` renvoient-ils des valeurs différentes pour l'initialisation de chaîne basée sur un pointeur et un tableau en C ?

Susan Sarandon
Libérer: 2024-11-01 07:14:02
original
705 Les gens l'ont consulté

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

Différentes réponses de strlen et sizeof pour l'initialisation de chaîne basée sur un pointeur et un tableau [dupliquer]

Dans le langage de programmation C, lors de la déclaration d'un tableau et un pointeur vers une chaîne, différentes sorties peuvent être obtenues en utilisant les fonctions 'strlen' et 'sizeof'. Comprendre cet écart est crucial pour une gestion efficace de la mémoire et une gestion des données.

Pour illustrer cette différence, considérons l'extrait de code suivant :

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

Le résultat produit sera :

7 4
7 8
Copier après la connexion
Copier après la connexion

La fonction 'strlen' renvoie le nombre de caractères dans la chaîne, à l'exclusion du terminateur nul. Dans les deux cas, la chaîne contient 7 caractères. La fonction 'sizeof', quant à elle, renvoie la taille du type de données en mémoire.

Pour 'str1', un pointeur, 'sizeof(str1)' renvoie la taille de la variable pointeur elle-même, ce qui représente généralement 4 octets sur la plupart des systèmes. En effet, « str1 » n'est pas un tableau mais simplement un pointeur vers la chaîne « Sanjeev ».

En revanche, « str2 » est un tableau de caractères. 'sizeof(str2)' renvoie la taille de l'ensemble du tableau, y compris le terminateur nul. En conséquence, il génère 8 octets : 7 octets pour les caractères et 1 octet pour le terminateur nul.

Pour mieux comprendre ce concept, considérons le code modifié suivant :

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));
Copier après la connexion

Ceci fois, la sortie sera :

7 4
7 8
Copier après la connexion
Copier après la connexion

Même si 'str1' et 'str2' font référence à la même chaîne, les sorties 'sizeof' restent les mêmes. En effet, « str1 » est toujours un pointeur et « str2 » reste un tableau. La sortie 'strlen' reste 7 pour les deux, car elle ne compte que les caractères de la chaîne.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal