Maison  >  Article  >  développement back-end  >  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
Susan Sarandonoriginal
2024-11-01 07:14:02620parcourir

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));

Le résultat produit sera :

7 4
7 8

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));

Ceci fois, la sortie sera :

7 4
7 8

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!

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