2012-03-14 4 views
6

현재 악용 기술 해킹을 읽고 있습니다. 거기에 올바른 것으로 보이지 않는 예가 있습니다. 오류의 결과를 컴파일하려고 :포인터 - '% x'경고 형식 '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); 
} 

내가 오류가 어디 있는지 이해, 나는이 문제를 해결하는 방법 단지 모르겠어요.

+0

@larsmans - 그는 그것을'int *'에 저장합니다, 문제입니까? – MByD

+0

@BinyaminSharet : 신경 쓰지 마세요, 코드를 잘못 읽었습니다. –

답변

15

포인터의 형식 지정자는 %x이 아닌 %p입니다. (here을 참조하십시오)

+0

대단히 감사합니다. 또 다른 빠른 질문을 보내 주시면 감사하겠습니다.경고 : 형식 '% p'은 'void *'유형의 인수를 필요로하지만 인수 2는 'int'유형을가집니다. [-Wformat] 이것은 무엇을 의미합니까? 왜 유형이 무효라고 기대합니까? – bigl

+2

@bigl 왜냐하면'% p' 형식 지정자를 사용하여'int *'인'int_ptr'을 인쇄하려고하기 때문입니다. 'int_ptr'과'int_ptr'는 포인터이며'% p'를 사용하여 인쇄해야하지만, 포인터가 가리키는 * 값은 정수이고'% d'을 사용하여 인쇄해야합니다 – Praetorian

+2

@bigl : 포인터를 가변적으로'printf'에 전달할 때 void 포인터 포인터 : printf ("% p", void *) (&x));'다른 포인터 유형은 같은 방법으로 배치 할 필요는 없지만 * 보장됩니다. –

관련 문제