gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:34:53 25 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” http://docs.cray.com/books/004-2179-003/004-2179-003-manual.pdf 中的表 3。

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

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