打印指针时出现问题。每次我尝试编译下面的程序时都会出现以下错误:
pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’
我显然在这里遗漏了一些简单的东西,但是从我见过的类似代码的其他考试中,这应该是有效的。
这是代码,任何帮助都会很棒!
#include <stdio.h>
int main(void)
{
int x = 99;
int *pt1;
pt1 = &x;
printf("Value at p1: %d\n", *pt1);
printf("Address of p1: %p\n", pt1);
return 0;
}
答案 0 :(得分:44)
只需将int指针转换为void one:
printf( "Address of p1: %p\n", ( void * )pt1 );
您的代码是安全的,但您正在使用-Wformat
警告标记进行编译,该标记会键入检查对printf()
和scanf()
的调用。
答案 1 :(得分:10)
请注意,您会收到一个简单的警告。您的代码可能按预期执行。
printf的"%p"
转换说明符需要void*
参数; pt1
的类型为int*
。
警告很好,因为int*
和void*
在奇怪的实现上可能有不同的大小或位模式或某些。
使用演员......将int*
转换为void*
printf("%p\n", (void*)pt1);
......即使在奇怪的实施上,一切都会很好。
答案 2 :(得分:2)
在这种情况下,编译器对警告有点过分了。您的代码非常安全,您可以选择删除警告:
printf("Address of p1: %p\n", (void *) pt1);
答案 3 :(得分:1)
消息说明了一切,但这只是一个警告而不是错误本身:
printf("Address of p1: %p\n", (void*)pt1);
答案 4 :(得分:-1)
这对我来说很好:
printf("Pointer address: %p.", pxy);
除非您希望...
,否则无需将其转换为任何内容。