Pouvons-nous imprimer l’adresse pour le littéral de chaîne?

J’ai fait un google à ce sujet et je me suis rendu compte que certains disent qu’il peut, d’autres pas.

Je voudrais juste vérifier.

Par exemple

char gchararr1i[] = "testing 123"; // global char array init char *gptr1i = "hello", *gptr2ui; // global char pointer init and un-init float gfloati = 123.4; // global float var init double gdoubleui; // global double var un-int int main(int argc, char *argv[]) { printf("\n Address of ssortingng literals \"testing 123\" = %p and \"hello\" = %p \n", gchararr1i, gptr1i);// output the addresses of ssortingng literals "testing 123" and "hello" f1(10, -20, 30.3, 'A', 45.67); exit(0); } 

Vous pouvez prendre l’adresse d’un littéral de chaîne, mais vous ne pouvez pas être sûr que deux littéraux de chaîne ayant exactement le même contenu seront à la même adresse (ou qu’ils n’auront pas la même adresse). La chaîne d’outils du compilateur est libre de faire ce qu’elle souhaite à cet égard.

La norme permet même à un littéral de chaîne de partager de la mémoire avec un autre. Par exemple, l’adresse du "world" pourrait “pointer dans” le "hello world" littéral. Je ne suis au courant d’aucune implémentation qui le fasse, mais je ne l’ai pas vérifiée non plus.

Pouvons-nous imprimer l’adresse pour le littéral de chaîne?

Oui. Un exemple simple pour imprimer l’adresse d’un littéral de chaîne.

 printf("%p\n", (void *) "Hello Word!"); 

Sortie

 0x100403055 

Ce qui suit gchararr1i[] l’adresse du premier élément de gchararr1i[] . Cela peut ou peut ne pas être l’adresse du littéral de chaîne. Le littéral chaîne peut même ne pas exister séparément dans le code.

 char gchararr1i[] = "testing 123"; printf("%p\n", (void *) gchararr1i); 

Sortie

 0x22caa0 

Ce qui suit imprime la valeur d’adresse du pointeur gptr1i qui se trouve être l’adresse du littéral de chaîne "hello" .

 char *gptr1i = "hello"; printf("%p\n", (void *) gptr1i); 

Sortie

 0x100403060 

Détail: "%p est uniquement défini avec les pointeurs d’impression void* . Lorsque vous imprimez des pointeurs d’object autres que void* , convertissez-les d’ abord en object de void * . @ User3386109 . Remarque: pour afficher les pointeurs de fonction, voir ceci .

 int x; // printf("%p\n", x); printf("%p\n", (void *)&x);