格式化的打印指针值

时间:2019-03-25 05:48:25

标签: c pointers printf language-lawyer

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

1 个答案:

答案 0 :(得分:2)

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

  

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

“可以”表示有可能发生转化。此类转换仅在被请求时才发生,使用语言标准指定哪些构造请求转换。

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