在不同平台上使用void指针

我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符。 它为什么以及究竟是什么问题?

 int x=100; int *pi=&x; printf("value of pi is: %p",(void*)pi); 

printf是一个可变函数,必须传递正确类型的参数。 标准说%pvoid *

对于可变函数 不会发生隐式转换 。

引自N1570 7.21.6.1 fprintf函数

p:参数应该是指向void的指针。 指针的值以实现定义的方式转换为打印字符序列。

内部表示或不同指针类型的大小不一定相同。

例如,在一个系统上, sizeof(void*)可能是2,但sizeof(int*)是1。

由于printf是可变参数函数,因此无法检查传入参数的类型。 如果你向它传递int* ,它会读取错误的字节数,因为它需要void*

printf p转换规范需要类型为void *的参数。 C表示如果传递其他类型的参数,则调用将调用未定义的行为。

除此之外,不要求不同类型的指针对象具有相同的表示:例如,C不保证sizeof (void *) == sizeof (int *) 。 C只保证void *与指向字符类型的指针具有相同的表示forms。