【发布时间】:2015-01-01 07:43:10
【问题描述】:
我听说应该首先将指针转换为 void 以确保跨平台的值的一致性,并且应该使用 %p 格式说明符。为什么会这样?问题究竟是什么?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
【问题讨论】:
标签: c pointers void-pointers format-specifiers
我听说应该首先将指针转换为 void 以确保跨平台的值的一致性,并且应该使用 %p 格式说明符。为什么会这样?问题究竟是什么?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
【问题讨论】:
标签: c pointers void-pointers format-specifiers
printf 是一个可变参数函数,必须传递正确类型的参数。标准说%p 接受void *。
Implicit cast doesn't take place 为variadic functions。
引用N1570 7.21.6.1 fprintf 函数
p : 参数应该是一个指向 void 的指针。指针的值为 在实现定义中转换为打印字符序列 方式。
【讨论】:
void* 使pi 的值有什么不同)?
void * 和 T *(其中 T 是非空类型)的大小相同。在指向void 的指针和指向(比如说)int 的指针的情况下,可变参数实现可能决定推送不同数量的字节。但是printf 会将此指针的值作为void * 类型获取,并将调用未定义的行为。
不同指针类型的内部表示或大小不一定相同。
例如在一个系统上,sizeof(void*) 可能是 2,但 sizeof(int*) 是 1。
由于printf是可变参数函数,它不能检查传入参数的类型。如果您将int* 传递给它,它会读取错误的字节数,因为它需要void*。
【讨论】:
printf 中的p 转换规范需要void * 类型的参数。 C 表示,如果您传递其他类型的参数,则调用会调用未定义的行为。
除此之外,不同类型的指针对象不需要具有相同的表示形式:例如,C 不保证 sizeof (void *) == sizeof (int *)。 C 只保证void * 与指向字符类型的指针具有相同的表示。
【讨论】:
void * 指定 UB。
fprintf 函数,表示 p 的参数应为指针 void *。
sizeof(void*) != sizeof(T*)(T 是什么)?