c指针 - 警告格式'%x'需要'unsigned int'类型的参数

big*_*igl 7 c x86 compiler-errors

我正在阅读Hacking剥削艺术,有一个例子,我似乎无法正确.尝试编译错误的结果:

./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);
}
Run Code Online (Sandbox Code Playgroud)

我理解错误的位置,我只是不确定如何解决这个问题.

MBy*_*ByD 16

指针的格式说明符%p不是%x.(见这里)

  • @bigl那是因为你可能正在尝试使用`%p`格式说明符打印`*int_ptr`(这是一个`int`).`int_ptr`和`&int_ptr`是指针,必须使用`%p`打印,但指针指向*的*是一个整数,必须使用`%d打印 (2认同)
  • @bigl:在将variadically传递给`printf`时,必须将任何指针转换为void指针:`printf("%p",(void*)(&x));`.不同的指针类型不需要以相同的方式布局,但它们*保证可以无损转换为`void*`. (2认同)