Imprimer l’adresse contenue dans un pointeur C

Je veux faire quelque chose qui semble assez simple. J’obtiens des résultats mais le problème est que je n’ai aucun moyen de savoir si les résultats sont corrects.

Je travaille en C et j’ai deux conseils; Je veux imprimer le contenu du pointeur. Je ne veux pas déréférencer le pointeur pour obtenir la valeur indiquée, je veux juste l’adresse que le pointeur a stockée.

J’ai écrit le code suivant et ce que j’ai besoin de savoir, c’est si c’est correct et si non, comment puis-je le corriger?

/* item one is a parameter and it comes in as: const void* item1 */ const Emp* emp1 = (const Emp*) item1; printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 ); 

Pendant que je poste ceci (et la raison pour laquelle il est important que ce soit correct), je dois éventuellement le faire pour un pointeur sur un pointeur. C’est:

 const Emp** emp1 = (const Emp**) item1; 

Ce que vous avez est correct. Bien sûr, vous verrez que emp1 et item1 ont la même valeur de pointeur.

Pour imprimer l’adresse dans le pointeur sur le pointeur:

 printf("%p",emp1) 

déréférencer une fois et imprimer la deuxième adresse:

 printf("%p",*emp1) 

Vous pouvez toujours vérifier avec le débogueur, si vous êtes sur Linux, utilisez ddd et affichez la mémoire, ou tout simplement gdb , vous verrez l’adresse de la mémoire afin que vous puissiez la comparer avec les valeurs de vos pointeurs.

Je crois que ce serait le plus correct.

 printf("%p", (void *)emp1); printf("%p", (void *)*emp1); 

printf() est une fonction variadic et doit être transmise aux arguments des types appropriés. La norme indique que %p est void * .

Comme vous semblez avoir déjà résolu l’affichage de l’adresse du pointeur de base, voici comment vérifier l’adresse d’un double pointeur:

 char **a; char *b; char c = 'H'; b = &c; a = &b; 

Vous pourriez accéder à l’adresse du double pointeur a en faisant:

 printf("a points at this memory location: %p", a); printf("which points at this other memory location: %p", *a); 
 char c = 'A'; printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c); 

résultat:

ptr: 0xbfb4027f, valeur: A, et adresse également: 3216245375

J’ai été dans cette position, surtout avec du nouveau matériel. Je vous suggère d’écrire votre propre routine de vidage hexadécimal. Vous pourrez voir les données et les adresses auxquelles elles se trouvent, toutes affichées ensemble. C’est une bonne pratique et un facteur de confiance.