printf和指针

Jos*_*een 22 c c++

可能重复:
正确的格式说明符打印指针(地址)?

使用时打印指针printf,是否需要将指针强制转换为void *?换句话说,在代码中

#include <stdio.h>
int main() {
    int a;
    printf("address of a = %p\n", &a);
}
Run Code Online (Sandbox Code Playgroud)

这个论点应该真的(void *) &a吗? gcc当没有明确的演员表时,似乎没有给出任何警告.

Kei*_*son 17

是的,演员void*是必需的.

int a;
printf("address of a = %p\n", &a);
Run Code Online (Sandbox Code Playgroud)

&a属于int*; printf的"%p"格式需要一个类型的参数void*.该int*参数未被隐式转换为void*,因为声明printf不提供除第一个(格式字符串)之外的参数的类型信息.格式字符串后面的所有参数都应用了默认参数升级 ; 这些促销活动不会转换int*void*.

可能的结果是printf看到一个真正属于类型的参数int*并将其解释类型void*.这是类型惩罚,而不是转换,它具有未定义的行为.如果int*并且void*碰巧具有相同的表示,它可能会发生作用,但语言标准并不保证,即使暗示.我所描述的类型惩罚只是一种可能的行为; 该标准几乎没有说明会发生什么.

(如果你用一个可见的原型非可变参数函数同样的事情,所以编译器知道在调用该参数的类型为点void*,那么它会生成代码做一个隐int*至- void*转换.这是不是这里的情况.)