2016-12-20 1 views
-3
#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int a=2; 
    ptr=&a; 
    printf("%p\n",ptr); 
    printf("%d\n",ptr); 
    printf("%p\n",a); 
    return 0; 
} 

La sortie que je reçois est:Qu'est-ce exactement que% p et pourquoi est-il différent de l'impression de la valeur int du pointeur en utilisant% d?

% ./a.out 
0x7ffe12032c40 
302197824 
0x2 
% 

La valeur des deux premiers changements de sortie (évidemment en raison de ASLR) et le 0x2 reste constante.

+5

'printf ("% d \ n ", ptr);' est un comportement indéfini. – Ari0nhh

+6

la taille du pointeur n'est pas toujours la même que la taille de int –

+1

Aussi, utilisez '% zu' pour' size_t' (au lieu de '% u'), et'% zd' pour 'ssize_t'. – e0k

Répondre

1

suivant la taille du pointeur n'est pas la même taille de int, donc vous ne pouvez pas utiliser% d% au lieu de p, p% est utilisé pour la valeur d'impression stockée dans la variable pointeur, utilisant aussi% p avec variable int est un comportement indéfini (si vous êtes sur un système avec pointeur et int de même taille, vous pouvez voir le résultat correct, mais comme standard C est un comportement indéfini)

sizeof int est défini par le compilateur, différents compilateurs peuvent avoir une taille différente de int sur une seule machine, mais la taille du pointeur est définie par type de machine (8,16,32,64 bits)

0

Il sert à l'impression de pointeurs. De la même manière que vous n'imprimez pas un flotteur avec %d, vous ne devriez pas imprimer un pointeur avec %d.

0

0x2 est simplement la représentation hexadécimale du nombre entier 2. Ce est pourquoi vous voyez que la production

printf() imprime la valeur d'une variable au format hexadécimal. Si vous voulez imprimer l'adresse d'un, procédez

printf("%p",&a); 
0

vous utilisez %p comme dans

printf("%p\n",ptr); 

%p est le spécificateur de format pour les pointeurs, vous obtenez les résultats attendus

Lorsque vous utilisez %d comme dans

printf("%d\n",ptr); 

%d est le spécificateur de format pour les entiers signés , vous obtenez des résultats inattendus, car la taille de pointers (qui est généralement de 8 octets) peut être différente de la taille de signed integers (qui est généralement 4 byt es).