gpt4 book ai didi

c - printf ("%p") 并转换为 (void *)

转载 作者:行者123 更新时间:2023-12-03 20:48:33 26 4
gpt4 key购买 nike

在最近的一个问题中,有人提到在使用 printf 打印指针值时,调用者必须将指针强制转换为 void *,如下所示:

int *my_ptr = ....

printf("My pointer is: %p", (void *)my_ptr);

对于我的生活,我无法弄清楚为什么。我找到了 this question ,这几乎是一样的。问题的答案是正确的 - 它解释了整数和指针的长度不一定相同。

这当然是真的,但是当我已经有一个指针时,就像上面的例子,为什么我要从 int * 转换至 void * ?什么时候 int * 与 void * 不同?其实什么时候 (void *)my_ptr生成任何不同于简单的机器代码 my_ptr ?

更新:
多名知识渊博的响应者引用了该标准,称传递错误的类型可能会导致未定义的行为。如何?我期待 printf("%p", (int *)ptr)printf("%p", (void *)ptr)生成完全相同的堆栈帧。两个调用何时会生成不同的堆栈帧?

最佳答案

%p转换说明符需要类型为 void * 的参数.如果您不传递 void * 类型的参数,函数调用调用未定义的行为。

来自 C 标准(C11,7.21.6.1p8 格式化输入/输出函数):

"p - The argument shall be a pointer to void."



C 中的指针类型不需要具有相同的大小或相同的表示形式。

具有不同指针类型表示的实现示例是 Cray PVP,其中指针类型的表示为 64 位 void *char *但其他指针类型为 32 位。

参见“Cray C/C++ 引用手册”,“9.1.2.2”中的表 3。 http://docs.cray.com/books/004-2179-003/004-2179-003-manual.pdf

关于c - printf ("%p") 并转换为 (void *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64265282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com