在最近的一个问题中,有人提到当使用printf打印指针值时,调用者必须将指针强制转换为void *,如下所示:
int *my_ptr = ....
printf("My pointer is: %p", (void *)my_ptr);
对于我的生活,我无法弄清楚为什么。我发现了这个问题,几乎是一样的。问题的答案是正确的 - 它解释了整数和指针的长度不一定相同。
这是当然的,真实的,但是当我已经在的情况下有一个指针,像上面,我为什么要由铸铁int *到void *?什么时候int *与void *不同?事实上,什么时候(void *)my_ptr生成任何与简单不同的机器代码my_ptr?
更新:多个知识渊博的响应者引用了标准,说传递错误的类型可能会导致未定义的行为。怎么样?我期望printf("%p", (int *)ptr)并printf("%p", (void *)ptr)生成完全相同的堆栈帧。两个调用何时生成不同的堆栈帧?
白衣染霜花
潇潇雨雨
相关分类