printf指针参数类型警告?

时间:2013-04-25 21:19:13

标签: c clang

有没有办法摆脱以下警告?我知道这是一个类型问题,因为我传递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'但参数的类型为

2 个答案:

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