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