c - 格式化打印指针值
问题描述
我发现我们可以使用%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 *
表示/对齐是否必须与任何对象类型相同。
解决方案
的版本(void *)
是正确的,并且您的原始代码会导致未定义的行为。(您已经提供了相关的标准报价,因此我无需添加更多报价)。
由于指向 void 的指针可以转换为指向任何其他对象类型的指针,我很好奇是否需要手动转换
“可以”意味着有可能发生转变。这种转换仅在被请求时才真正发生,语言标准指定了哪些构造请求转换。
对于 的参数printf
,仅应用默认参数提升。没有任何其他转换。
推荐阅读
- angular - 升级到 Angular 12 后,所有材料成分都是“未知元素”
- php - Symfony:在属性路径中给出“?Doctrine\Common\Collections\Collection”,“array”类型的预期参数
- angular - 在 Angular 12 迁移期间获取类型 AgGridModule 没有“emod”属性
- javascript - 关于一行代码的另一个 Javascript 问题
- java - 使用 Regex 删除字符串开头的空格会产生 null Java
- r - 找不到我的 bookdown 书目文件
- javascript - 从 Javascript 读取的 CSV 文件上的平方问号符号
- flutter - 自定义液体滑动动画
- java - NoSuchMethodException while sending email in spring boot
- javascript - 拖动操作在 iOS Safari 上运行良好,但在 Android 上不行