首页 > 解决方案 > 格式化打印指针值

问题描述

我发现我们可以使用%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 *表示/对齐是否必须与任何对象类型相同。

标签: cpointersprintflanguage-lawyer

解决方案


的版本(void *)是正确的,并且您的原始代码会导致未定义的行为。(您已经提供了相关的标准报价,因此我无需添加更多报价)。

由于指向 void 的指针可以转换为指向任何其他对象类型的指针,我很好奇是否需要手动转换

“可以”意味着有可能发生转变。这种转换仅在被请求时才真正发生,语言标准指定了哪些构造请求转换。

对于 的参数printf,仅应用默认参数提升。没有任何其他转换。


推荐阅读