printf指针参数类型警告?

有没有一个好方法摆脱以下警告? 我知道这是一个类型问题,因为我传递的是unsigned long pointer而不是unsigned long整数,但是printf以某种方式支持指针作为参数吗? 我的迂腐想要摆脱这个警告。 如果没有,你如何处理使用printf打印取消引用的指针值?

 #include  int main (void) { unsigned long *test = 1; printf("%lu\n", (unsigned long*)test); return 0; } 

警告:format指定类型’unsigned long’但参数具有类型

 unsigned long *test = 1; 

无效C.如果要指向值为1的对象,可以执行以下操作:

 unsigned long a = 1; unsigned long *test = &a; 

或使用C99复合文字:

 unsigned long *test = &(unsigned long){1UL}; 

现在还:

 printf("%lu\n", (unsigned long*)test); 

是不正确的。 你真的想要:

 printf("%lu\n", *test); 

打印unsigned long object *test

要打印test指针值(以实现定义的方式),您需要:

 printf("%p\n", (void *) test); 

你不需要进行类型转换test ,%p将采用任何指针(即使规范说它需要一个空*)。 使用%p转换说明符是通过printf打印指针的最安全(并且令人惊讶,最便携)的机制。

 #include  int main (void) { unsigned long ul = 1; unsigned long *test = &ul; printf("%p\n", test); return 0; } 

编辑:哦是的,并且还要小​​心尝试使用intlong等类型依赖于它们的类型大小。 这是依赖于实现的,并且可以(并确实)在这些平台的不同平台和编译器上进行更改。 C标准只是说long必须至少与int一样大。 printf “length modifiers”的POSIX标准不指定位大小,而是指定C类型。 因此,你不能假设sizeof(long) == sizeof(void*) (好吧,他们在Linux内核中做出了这个假设,但它与gcc结合在一起,总是如此)。