在不同平台上使用void指针

时间:2014-11-05 07:23:49

标签: c pointers void-pointers format-specifiers

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

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

3 个答案:

答案 0 :(得分:13)

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

对于Implicit cast doesn't take place

variadic functions

引自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 *与字符类型的指针具有相同的表示。