【发布时间】:2014-01-26 16:54:03
【问题描述】:
还有另一个问题是这样讨论的:When printf is an address of a variable, why use void*?,但它只回答了为什么不应该将指针打印为整数。
另一个问题讨论了在将指针传递给可变参数函数时,您应该始终将指针转换为 void*:Argument conversion: (normal) pointer to void pointer, cast needed?。它说如果你不这样做,你就会调用未定义的行为,但它并没有超出这个范围。
确实:
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 是一个非空指针。
很明显,如果您不进行强制转换,它会将其他东西推入堆栈。它可能推动什么?为什么?
使传递非空指针未定义行为的基本原理是什么?这对我来说没有意义......
我一直认为指针转换只是提示编译器在读取或写入时如何解释指向的数据。但是当只传递指针值时,我希望它传递相同的字节序列,而不管类型如何。
【问题讨论】:
-
pIReport4的类型是什么? -
那么
pIReport4是指向非void的指针吗?问题是,并非所有指针都可能具有相同的表示(宽度、位模式的解释等)和对齐要求。如果确实如此,则转换为void *会进行必要的转换。 -
pIReport4的类型是什么?
-
pIReport4 是一个非空指针。
-
什么编译器、架构和优化级别?
标签: c arguments void-pointers variadic-functions