在不同平台上使用void指针

李 *_* 慕 13 c pointers void-pointers format-specifiers

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

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

Moh*_*ain 13

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

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

引自N1570 7.21.6.1 fprintf函数

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

  • @barakmanos C规范不要求`void*`和`T*`(其中T是非void类型)的大小相同.可变参数实现可以决定在指向"void"和指向(例如)"int"的指针的情况下推送不同数量的字节.但是`printf`会将此指针的值取为`void*`类型,并将调用未定义的行为. (2认同)

use*_*733 8

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

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

由于printf是变量参数函数,因此无法检查传入参数的类型.如果你传递int*给它,它将读取错误的字节数,因为它期望void*.


oua*_*uah 8

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

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