C指针 - 警告格式“%x”需要无符号整型参数

7

我目前正在阅读《黑客攻防技术宝典》,其中有一个例子我似乎无法正确地实现。尝试编译时会出现以下错误:

./addressof.c: In function ‘main’:
./addressof.c:8:4: warning: format ‘%x’ expects argument of type ‘unsigned int’,
but argument 2 has typeint *’ [-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);
}

我知道错误出在哪里,但是不确定该如何修复。

1个回答

16

指针的格式说明符是%p,而不是%x。(参见这里)


非常感谢,还有一个问题请教。我又遇到了一个错误 - 警告:格式“%p”期望类型为“void *”的参数,但参数2的类型为“int”[-Wformat]这是什么意思?为什么它期望void类型? - bigl
2
@bigl 这是因为您可能正在尝试使用%p格式说明符打印*int_ptr(即int)。 int_ptr&int_ptr是指针,必须使用%p进行打印,但指针指向的是一个整数,必须使用%d进行打印。 - Praetorian
2
@bigl:当通过可变参数传递到 printf 时,您必须将任何指针转换为 void 指针进行强制转换:printf("%p", (void*)(&x));。不同的指针类型不需要以相同的方式布局,但是它们确实保证可以无损地转换为 void* - Kerrek SB
我要补充一点,在至少Xcode 4.4.1版本中,您必须使用%8p而不是%08p(前导零不支持p说明符)。 - Nicolas Miari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接