2012-03-14 9 views
6

Actualmente estoy leyendo Hackear el arte de la explotación y hay un ejemplo allí que parece que no puedo corregir. El intento de compilar los resultados en el error:punteros c - formato de advertencia '% x' espera argumentos de tipo 'unsigned int'

./addressof.c: In function ‘main’: 
./addressof.c:8:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, 
but argument 2 has type ‘int *’ [-Wformat] 


#include <stdio.h> 
int main() { 
    int int_var = 5; 
    int *int_ptr; 

    int_ptr = &int_var; // Put the address of int_var into int_ptr. 

    printf("int_ptr = 0x%08x\n", int_ptr); 
    printf("&int_ptr = 0x%08x\n", &int_ptr); 
    printf("*int_ptr = 0x%08x\n\n", *int_ptr); 

    printf("int_var is located at 0x%08x and contains %d\n", &int_var, int_var); 
    printf("int_ptr is located at 0x%08x, contains 0x%08x, and points to %d\n\n", 
     &int_ptr, int_ptr, *int_ptr); 
} 

entiendo dónde está el error, pero no estoy seguro de cómo solucionar este problema.

+0

@larsmans - lo guarda en 'int *', ¿es un problema? – MByD

+0

@BinyaminSharet: no importa, leyó mal el código. –

Respuesta

15

El especificador de formato para el puntero es %p, no %x. (Consulte here)

+0

Muchas gracias, otra pregunta rápida si lo desea. Recibo solo un error más - advertencia: el formato '% p' ​​espera el argumento de tipo 'void *', pero el argumento 2 tiene el tipo 'int' [-Wformat] ¿Qué significa esto? ¿Por qué espera que el tipo sea nulo? – bigl

+2

@bigl Eso es porque probablemente estés tratando de imprimir '* int_ptr' (que es un' int') usando el especificador de formato '% p'. 'int_ptr' y' & int_ptr' son punteros y deben imprimirse usando '% p', pero el * valor al que apunta el puntero * es un número entero y debe imprimirse usando'% d' – Praetorian

+2

@bigl: debe lanzar cualquier puntero al puntero de vacío al pasarlo de forma variable a 'printf':' printf ("% p", (void *) (&x));). No es necesario que los diferentes tipos de punteros se distribuyan de la misma manera, pero * están * garantizados ser convertible sin pérdidas a 'void *'. –

Cuestiones relacionadas