C语言 格式化的打印指针值



我发现我们可以用%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的参数,仅应用默认参数升级。没有任何其他转换。

最新更新