【问题标题】:Formatted printing pointer value格式化打印指针值
【发布时间】:2023-04-07 23:50:01
【问题描述】:

我发现我们可以使用%p 格式说明符打印指针值。 N15707.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 * 表示/对齐是否必须与任何对象类型相同。

【问题讨论】:

  • 简短回答 - 是的,您需要强制转换为 void-pointer

标签: c pointers printf language-lawyer


【解决方案1】:

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

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

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

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

【讨论】:

  • 有道理。谢谢。但由于标准规定void *char * 具有相同的表示和对齐要求,如果我想打印char *,是否可以省略演员表?
  • @SomeName 可能
  • 我认为可以。有一个信息性注释48) 相同的表示和对齐要求意味着作为函数参数的可互换性
  • @SomeName If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined。如果规则说“参数应是指向 void 的指针”,则传递任何其他内容都违反了要求。
  • @LanguageLawyer IMO 关于 char*/void* 的另一部分旨在取代这一点(这已在其他 LL 问题中讨论过)
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 2011-01-29
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多