web-dev-qa-db-fra.com

Imprimer l'adresse ou le pointeur pour la valeur en 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 indicateurs; Je veux imprimer le contenu du pointeur. Je ne veux pas déréférencer le pointeur pour obtenir la valeur pointé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 s'il 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), c'est que je dois éventuellement le faire pour un pointeur sur un pointeur. C'est:

const Emp** emp1 = (const Emp**) item1; 
77
Frank V

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

29
Don Neufeld

Pour imprimer une adresse en pointeur à 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 sous Linux, utilisez ddd et affichez la mémoire, ou tout simplement gdb, vous verrez l'adresse de la mémoire afin que vous puissiez comparer avec les valeurs de vos pointeurs.

38
stefanB

Je crois que ce serait très correct.

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

printf() est une fonction variée et doit recevoir les arguments des types appropriés. La norme dit que %p Prend void *.

14
sigjuice

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

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

b = &c;
a = &b;

Vous pourrez accéder à l'adresse du pointeur double a en faisant:

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
9
Luca Matteis
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: 3216245375

4
4pie0

J'ai été dans cette position, en particulier avec le nouveau matériel. Je vous suggère d'écrire votre propre routine de vidage d'hexagones. Vous pourrez voir les données et les adresses correspondantes affichées. C'est une bonne pratique et un facteur de confiance.

0
gbarry