如何打印内存地址?

Mar*_*eke 1 c linux pointers

我在youtube教程中看到过有关指针的人printf,即变量的内存地址.有问题的视频在Code:Blocks中做了这个,它可以在那里工作%p,但每当我在Geany(VirtualBox)中尝试完全相同的东西时,我得到一个编译错误.我应该尝试另一种%字母Linux吗?

      int main(int argc, char *argv[]){
          int var;

          printf("%p\n", &var);

          return 0;
       }
Run Code Online (Sandbox Code Playgroud)

我不需要它来进行锻炼或其他什么,只需要好奇心(并且为了更好地理解指针的概念,我猜).提前致谢!

编辑:错误消息是Linux希望我在它打印之前转换&var为a (void*).对不起,我不是很清楚:我的问题基本上是,这是一个Linux/Windows的东西吗?为什么Windows会像现在这样接受它,而Linux希望我把它作为一个void指针来接受?

错误信息:

Fre*_*son 5

%p说明符需要一个void*,而你给它一个int*.所以只需投下它:

printf("%p\n", (void*)&var);
Run Code Online (Sandbox Code Playgroud)

如果这是一个正常的函数,从int*到void*的转换将是自动的,不会产生警告.但由于printf()是一个可变函数,因此转换必须是显式的.变量函数的参数不需要进行类型检查.但是,一些编译器知道标准函数(包括printf())如何工作并将警告错误的使用.

  • @jforberg这是一个可变参数函数,除标准促销之外,它们不进行自动转换. (5认同)
  • `%x`不适用于指针值.它可能"有效",但如果指针和int的大小不同则不行. (2认同)
  • @Marieke:如果转换说明符和参数类型在`printf`语句中不匹配,则行为为*undefined*.编译器不需要为未定义的行为发出诊断.此外,未定义行为的一种可能表现是您的代码按预期工作.这里唯一的道德是你需要a)尽可能高地提高警告级别,无论你使用什么编译器,b)了解哪种类型与哪种格式说明符有关. (2认同)