web-dev-qa-db-fra.com

Comment imprimer une adresse mémoire en C

Mon code est:

#include <stdio.h>
#include <string.h>

void main()
    {
    char string[10];
    int A = -73;
    unsigned int B = 31337;

    strcpy(string, "sample");

    // printing with different formats
    printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A);
    printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B);
    printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B);

    // Example of unary address operator (dereferencing) and a %x
    // format string 
    printf("variable A is at address: %08x\n", &A);

J'utilise le terminal dans linux mint pour compiler, et quand j'essaie de compiler en utilisant gcc, j'obtiens le message d'erreur suivant:

basicStringFormatting.c: In function ‘main’:
basicStringFormatting.c:18:2: warning: format ‘%x’ expects argument
of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("variable A is at address: %08x\n", &A);

Tout ce que j'essaie de faire, c'est d'imprimer l'adresse en mémoire de la variable A.

18
varlotbarnacle

Utilisez le spécificateur de format %p:

printf("variable A is at address: %p\n", (void*)&A);

La norme requiert que l'argument soit de type void* pour %p spécificateur. Étant donné que printf est une fonction variadique, il n'y a pas de conversion implicite en void * de T * ce qui se produirait implicitement pour toutes les fonctions non variadiques en C. Par conséquent, le transtypage est requis. Pour citer la norme:

7.21.6 Fonctions d'entrée/sortie formatées (projet C11)

p L'argument doit être un pointeur vers void. La valeur du pointeur est convertie en une séquence de caractères d'impression, d'une manière définie par l'implémentation.

Alors que vous utilisez %x, qui attend unsigned int tandis que &A est de type int *. Vous pouvez lire sur les spécificateurs de format pour printf du manuel . La non-concordance du spécificateur de format dans printf conduit à comportement indéfini .

41
P.P.