我听说指针首先应该转换为void以确保跨不同平台的值的一致性,并且应该使用%p
格式说明符。它为什么以及究竟是什么问题?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
答案 0 :(得分:13)
printf
是一个可变函数,必须传递正确类型的参数。标准说%p
需要void *
。
引自N1570 7.21.6.1 fprintf函数
p:参数应该是指向void的指针。指针的值是 转换为一系列打印字符,在实现定义中 方式。
答案 1 :(得分:8)
不同指针类型的内部表示或大小不一定相同。
例如,在一个系统sizeof(void*)
上可能是2,但sizeof(int*)
是1。
由于printf
是变量参数函数,因此无法检查传入参数的类型。如果您将int*
传递给它,则会读取错误的字节数,因为它需要void*
。
答案 2 :(得分:8)
p
中的 printf
转换规范要求参数类型为void *
。 C表示如果传递其他类型的参数,则调用将调用未定义的行为。
除此之外,不要求不同类型的指针对象具有相同的表示:例如,C不保证sizeof (void *) == sizeof (int *)
。 C只保证void *
与字符类型的指针具有相同的表示。