有没有办法摆脱以下警告?我知道这是一个类型问题,因为我传递unsigned long pointer
而不是unsigned long
,但是printf以某种方式支持指针作为参数吗?我的迂腐想要摆脱这个警告。如果没有,您如何处理使用printf
打印取消引用的指针值?
#include <stdio.h>
int main (void) {
unsigned long *test = 1;
printf("%lu\n", (unsigned long*)test);
return 0;
}
警告:format指定类型'unsigned long'但参数的类型为
答案 0 :(得分:12)
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
对象*test
的值。
要打印test
指针值(以实现定义的方式),您需要:
printf("%p\n", (void *) test);
答案 1 :(得分:0)
你确实需要类型转换test
,%p将采用任何指针(即使规范说它需要一个空*)。使用%p
转换说明符是通过printf打印指针的最安全(并且令人惊讶,最便携)的机制。
#include <stdio.h>
int main (void) {
unsigned long ul = 1;
unsigned long *test = &ul;
printf("%p\n", test);
return 0;
}
编辑:哦,是的,并且还要小心尝试使用int
,long
等类型,依赖于它们的类型大小。这是依赖于实现的,并且可以(并确实)在这些平台的不同平台和编译器上进行更改。 C标准只是说long
必须至少与int
一样大。 POSIX standard for printf“长度修饰符”不指定位大小,而是指定C类型。因此,你不能假设sizeof(long) == sizeof(void*)
(好吧,他们在Linux内核中做出了这个假设,但是它与gcc结合在一起总是如此)。