在不同平台上使用void指针
我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p
格式说明符。 它为什么以及究竟是什么问题?
int x=100; int *pi=&x; printf("value of pi is: %p",(void*)pi);
printf
是一个可变函数,必须传递正确类型的参数。 标准说%p
取void *
。
对于可变函数 不会发生隐式转换 。
引自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。