5

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

#include <stdio.h>

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

警告:格式指定类型“无符号长”,但参数有类型

4

2 回答 2

12
unsigned long *test = 1;

是无效的 C。如果你想要一个指向 value 对象的指针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);
于 2013-04-25T21:19:48.813 回答
0

真的不需要 typecast test, %p 将采用任何指针(即使规范说它需要一个 void*)。使用%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. printf“长度修饰符”的POSIX 标准没有以位为单位指定大小,而是按 C 类型指定大小。因此,您不能假设这一点sizeof(long) == sizeof(void*)(好吧,他们在 Linux 内核中做出了这个假设,但它与 gcc 结合在一起,这总是正确的)。

于 2013-04-25T21:28:15.653 回答