2012-03-14 31 views
6

Tôi hiện đang đọc Hacking nghệ thuật khai thác và có một ví dụ trên đó mà tôi dường như không thể chính xác. Đang cố gắng biên dịch kết quả do lỗi:c con trỏ - định dạng cảnh báo '% x' hy vọng các đối số của loại '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); 
} 

Tôi hiểu được lỗi ở đâu, tôi không chắc chắn cách khắc phục điều này.

+0

@larsmans - anh ấy lưu nó trong 'int *', đó có phải là vấn đề không? – MByD

+0

@BinyaminSharet: đừng bận tâm, đọc sai mã. –

Trả lời

15

Trình định dạng định dạng cho con trỏ là %p, không phải %x. (Xem here)

+0

Cảm ơn bạn rất nhiều, một câu hỏi nhanh khác nếu bạn muốn. Tôi nhận được thêm một lỗi nữa - cảnh báo : định dạng ‘% p’ dự kiến ​​đối số của loại ‘void *’, nhưng đối số 2 có loại ‘int’ [-Wformat] Điều này có nghĩa là gì? Tại sao nó mong đợi loại void? – bigl

+2

@bigl Đó là vì bạn có thể đang cố gắng in '* int_ptr' (là một' int') bằng cách sử dụng định dạng '% p'. 'int_ptr' và' & int_ptr' là con trỏ và phải được in bằng '% p', nhưng giá trị * mà con trỏ trỏ tới * là số nguyên và phải được in bằng cách sử dụng'% d' – Praetorian

+2

@bigl: Bạn phải truyền bất kỳ con trỏ để void con trỏ khi vượt qua nó variadically thông qua để 'printf':' printf ("% p", (void *) (&x)); '. Các loại con trỏ khác nhau không cần phải được đặt ra theo cùng một cách, nhưng họ * được * đảm bảo –

Các vấn đề liên quan