我发现我们可以使用%p
格式说明符来打印指针值。 N1570 7.21.6.1(p8)
:
p 参数应为指向void的指针。指针的值是 转换为一系列打印字符 实现定义的方式
由于可以将指向void的指针转换为指向任何其他对象类型的指针,所以我很好奇是否需要手动进行转换。示例:
struct test_t{
int a;
}
void foo(){
struct test_t *test_ptr = malloc(sizeof(*test_ptr));
printf("Pointer test_ptr = %p\n", test_ptr);
}
在这里,我没有将其转换为void *
,前提是编译器为我完成了此操作。符合吗?或者我应该像这样将指针自动转换为void *
printf("Pointer test_ptr = %p\n", (void *) test_ptr);
该标准指定void *
的表示形式和对齐方式与char *
相同。 void *
表示形式/对齐方式是否必须与任何对象类型相同都未指定。
答案 0 :(得分:2)
带有(void *)
的版本是正确的,并且您的原始代码会导致未定义的行为。 (您已经提供了相关的标准报价,因此我无需添加其他报价)。
由于可以将指向void的指针转换为指向任何其他对象类型的指针,我很好奇是否需要手动转换
“可以”表示有可能发生转化。此类转换仅在被请求时才发生,使用语言标准指定哪些构造请求转换。
对于printf
的参数,仅应用默认的参数提升。没有其他转换。