我发现我们可以用%p
格式说明符打印指针值。N1570 7.21.6.1(p8)
:
p 参数应为无效指针。指针的值为 转换为打印字符序列,在 实现定义的方式
由于指向 void 的指针可以转换为指向任何其他对象类型的指针,我很好奇是否需要手动转换。例:
struct test_t{
int a;
}
void foo(){
struct test_t *test_ptr = malloc(sizeof(*test_ptr));
printf("Pointer test_ptr = %pn", test_ptr);
}
在这里,我没有将其转换为void *
假设编译器为我执行此操作。符合吗?或者我应该自己将这些指针转换为void *
printf("Pointer test_ptr = %pn", (void *) test_ptr);
该标准规定void *
的表示和对齐方式与char *
相同。如果表示/对齐void *
必须与任何对象类型相同,则未指定。
带有 (void *)
的版本是正确的,并且您的原始代码会导致未定义的行为。 (您已经提供了相关的标准报价,所以我无需添加更多报价(。
由于指向 void 的指针可以转换为指向任何其他对象类型的指针,我很好奇是否需要手动转换
"可以"意味着有可能发生转换。这样的转换只在请求时实际发生,语言标准指定哪些构造请求转换。
对于要printf
的参数,仅应用默认参数升级。没有任何其他转换。