Maison >développement back-end >C++ >Quelle est la différence entre « sizeof » un littéral de chaîne, un « const char* const » et un « const char[] » ?

Quelle est la différence entre « sizeof » un littéral de chaîne, un « const char* const » et un « const char[] » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 17:19:10668parcourir

What's the Difference Between `sizeof` a String Literal, a `const char* const`, and a `const char[]`?

Taille du littéral de chaîne : démêler les différences

Considérez l'extrait de code suivant :

#include <iostream>
using namespace std;

int main()
{
    const char* const foo = "f";
    const char bar[] = "b";
    cout << "sizeof(string literal) = " << sizeof("f") << endl;
    cout << "sizeof(const char* const) = " << sizeof(foo) << endl;
    cout << "sizeof(const char[]) = " << sizeof(bar) << endl;
}

L'exécution de ce code révèle intrigant results :

sizeof(string literal) = 2
sizeof(const char* const) = 4
sizeof(const char[]) = 2

Comprendre les résultats

  • sizeof("f") : Ceci est évalué à 2, car il inclut le caractère 'f' et le caractère nul final ' '.
  • sizeof(foo): Puisque foo est un pointeur, sizeof(foo) renvoie 4 sur un système 32 bits et 8 sur un système 64 bits. Cela représente la taille du pointeur lui-même, pas la chaîne vers laquelle il pointe.
  • sizeof(bar): Cette expression renvoie 2 car bar est un tableau de deux caractères : 'b' et ' '.

Interprétation du type littéral de chaîne

Pendant que sizeof calcule l'espace requis pour la chaîne littérale, il ne modifie pas son type sous-jacent. La chaîne littérale continue d'avoir le type « tableau de taille N de caractère const », où N représente le caractère nul de fin.

Comportement du tableau par rapport au pointeur

Il est crucial de noter que les tableaux ne se dégradent pas en pointeurs lorsqu'ils sont transmis à sizeof. Cela signifie que sizeof(bar) renvoie la taille du tableau lui-même, et non la taille d'un pointeur vers le tableau.

Conclusion

En résumé, sizeof(" f") renvoie l'espace requis pour la chaîne littérale, y compris le caractère nul. Cependant, sizeof(foo) et sizeof(bar) se comportent différemment en raison des différences de type impliquées. Comprendre ces nuances est essentiel lorsque l'on travaille avec des chaînes littérales en programmation C.

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