2012-03-14 31 views
6

私は現在読んでいます。搾取の技術をハッキングしています。エラーが発生してコンパイルしようとするとエラーがある場合cポインタ - 警告フォーマット '%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

ポインタの書式指定子は%pであり、%xではありません。 (hereを参照してください)

+0

どうかありがとうございました。警告:フォーマット '%p'は 'void *'型の引数を必要としますが、引数2は 'int'型です[-Wformat]これはどういう意味ですか?なぜそれは型voidを期待していますか? – bigl

+2

@biglこれは、 '%p'フォーマット指定子を使って' int_ptr'( 'int')を出力しようとしているからでしょう。 'int_ptr'と'&int_ptr'はポインタであり、 '%p'を使って出力する必要がありますが、ポインタが指している*値は整数で、'%d'を使って出力しなければなりません。 – Praetorian

+2

@bigl: printf( "%p"、void *)(&x)); '。異なるポインタ型は同じ方法で配置する必要はありませんが、*保証されています –

関連する問題