chaîne de caractères pour initialiseur un tableau de caractères
Question
Dans les règles suivantes pour le cas où tableau désintègre à pointeur:
Une lvalue [voir question 2.5] du tableau de type-of-T qui apparaît dans une expression décroît (avec trois exceptions) en un pointeur vers le premier élément; le type de pointeur est obtenu pointeur à T.
(Les exceptions sont lorsque le tableau est l'opérande d'un sizeof ou d'opérateur, ou est un initialiseur de chaîne littérale pour un tableau de caractères.)
Comment comprendre le cas lorsque le tableau est « initialiseur de chaîne littérale pour un tableau de caractères »? Quelques exemples s'il vous plaît.
Merci!
La solution
Les trois exceptions où un tableau ne se dégrade pas en un pointeur sont les suivantes:
Exception 1 -.. Lorsque le réseau est l'opérande de sizeof
int main()
{
int a[10];
printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */
int* p = a;
printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}
Exception 2 -.. Lorsque le tableau est l'opérande de l'opérateur &
int main()
{
int a[10];
printf("%p", (void*)(&a)); /* prints the array's address */
int* p = a;
printf("%p", (void*)(&p)); /*prints the pointer's address */
}
Exception 3 -.. Lorsque le tableau est initialisé avec une chaîne de caractères
int main()
{
char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */
char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}
Autres conseils
Supposons que les déclarations
char foo[] = "This is a test";
char *bar = "This is a test";
Dans les deux cas, le type de littéral chaîne « This is a test
» est « tableau 15 éléments de char ». Dans la plupart des cas, les expressions du tableau sont convertis implicitement à partir du type « tableau N-élément de T » à « pointeur sur T », et l'expression renvoie à l'adresse du premier élément du tableau. Dans la déclaration de bar
, c'est exactement ce qui se passe.
Dans la déclaration de foo
, cependant, l'expression est utilisée pour initialiser le contenu d'un autre tableau, et est donc pas converti en un type de pointeur; à la place, les contenu de la chaîne littérale sont copiés foo
.
Ceci est un initialiseur de chaîne littérale pour un tableau de caractères:
char arr[] = "literal string initializer";
Peut-être aussi:
char* str = "literal string initializer";
Définition de K & R2:
Une chaîne, appelée aussi une chaîne constant, est une séquence de caractères entouré par des guillemets doubles comme dans "...". Une chaîne est de type `` réseau de personnages »et la classe de stockage statique (Voir Par.A.3 ci-dessous) et est initialisé avec les caractères donnés. Qu'il s'agisse littéraux de chaîne identiques sont distincts est, et la mise en œuvre défini comportement d'un programme qui tente de modifier une chaîne de caractères est définie.
Il semble que vous avez tiré cette citation de la FAQ comp.lang.c (peut-être une ancienne version ou peut-être la version imprimée, il ne correspond pas tout à fait avec l'état actuel de celui en ligne):
http://c-faq.com/aryptr/aryptrequiv.html
Les liens de la section correspondant à d'autres sections de la FAQ d'élaborer sur ces exceptions. Dans votre cas, vous devriez regarder: