82 votes

Imprimer l'adresse ou le pointeur de 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 pointeurs ; 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 j'ai besoin de savoir s'il est correct et si non, comment 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 );

Si je poste ceci (et la raison pour laquelle il est important que ce soit correct), c'est que j'aurai éventuellement besoin de le faire pour un pointeur vers un pointeur. C'est-à-dire :

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

0 votes

Ce que vous avez écrit est correct, quel problème rencontrez-vous exactement ?

0 votes

Comme je l'ai décrit, j'obtenais des résultats, mais je n'avais aucun moyen de savoir si les résultats étaient corrects ou s'il s'agissait de déchets. Don et d'autres personnes ci-dessous (ainsi que vous-même) ont confirmé que ces résultats sont valables.

40voto

stefanB Points 27796

Pour imprimer l'adresse dans le pointeur vers le pointeur :

printf("%p",emp1)

pour 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 la mémoire d'affichage, ou tout simplement gdb vous verrez l'adresse de la mémoire, ce qui vous permettra de comparer avec les valeurs de vos pointeurs.

28voto

Don Neufeld Points 12803

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

1 votes

Ils ne seront pas les mêmes si le type de item1 fait partie d'un héritage multiple et/ou est un ancêtre de Emp, selon la façon dont le compilateur dispose chacune des classes qui composent le type de item1.

2 votes

@Jim : L'étiquette "C" suggère le contraire.

1 votes

@Jim : Hasturkun a raison. Je travaille en C. J'aurais dû le signaler.

17voto

sigjuice Points 9166

Je pense que ce serait le plus correct.

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

printf() est une fonction variadique et doit recevoir des arguments de types appropriés. La norme dit %p prend void * .

0 votes

J'imagine qu'ils sont promus ? Je n'en suis pas sûr, quelqu'un peut-il m'éclairer ?

4 votes

Après quelques recherches, non, ils ne sont pas promus automatiquement. Un casting pour void * est en effet nécessaire.

10voto

Luca Matteis Points 19338

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

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

b = &c;
a = &b;

Vous seriez en mesure d'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);

1 votes

printf("which contains this value: %c\n" **a); Je voulais juste ajouter que ^.^.

0voto

gbarry Points 3813

J'ai été dans cette situation, 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, affichées toutes ensemble. C'est un bon entraînement et un facteur de confiance.

3 votes

Au risque de paraître ignorant, pourriez-vous nous expliquer comment on écrit un tel programme ?

1 votes

Cette réponse peut également être mieux adaptée en tant que commentaire ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X