还有另一个问题讨论这样的问题:当printf是变量的地址时,为什么要使用void *?,但这仅回答了为什么不应该将指针打印为int的原因。
另一个问题讨论了在将指针传递给可变参数函数时,应始终将其转换为void *:参数转换:(常规)指向void指针的指针,需要转换吗?。它说,如果不这样做,则会调用未定义的行为,但不会超出此范围。
确实:
if (pIReport4 == NULL)
{
printf("It's NULL but when I print it, it becomes: %p\n", pIReport4);
printf("It's NULL but when I print it and cast it into (void*), it becomes: %p\n", (void*)pIReport4);
printf("And NULL is: %p\n", NULL);
}
印刷品:
It's NULL but when I print it, it becomes: 0xc68fd0
It's NULL but when I print it and cast it into (void*), it becomes: (nil)
And NULL is: (nil)
pIReport4是一个非空指针。
很明显,如果不进行强制转换,它将把其他东西推入堆栈。它会推动什么?为什么?
使传递非空指针成为未定义行为的基本原理是什么?对我来说这没有意义...
我一直认为指针强制转换只是编译器在读取或写入时如何解释所指向数据的提示。但是,当仅传递指针值时,我希望无论类型如何,它都传递相同的字节序列。
正如第二个链接中的答案所说明的那样
对于
printf
,p
转换说明符需要一个void *
参数。如果参数的类型不同,则函数调用将调用undefined behavior。因此,如果的参数p
是对象指针类型,void *
则必须使用()强制转换。
也就是说,由于您的代码段调用了未定义的行为,因此您可以获得任何预期或意外结果。您得到的结果也可能因编译器而异。在我的编译器(GCC 4.8.1)上,给出的结果是:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句