可能重复:
正确的格式说明符打印指针(地址)?
使用时打印指针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*转换.这是不是这里的情况.)
| 归档时间: |
|
| 查看次数: |
26578 次 |
| 最近记录: |