void*
在关于C Do I cast the result of malloc?的投票最多的问题之一中,据说您不需要强制转换void
函数或其家族成员之一的返回的malloc()
指针,因为自从标准以来,它可以省略,可能会引起一些问题。
但是一般来说,void
指针的转换如何?与投射void
指针的一般方法有什么区别?
void
指针强制转换为C语言中的另一种类型的指针?void
指针的地方?在两种情况下,您需要强制转换:
使一个笨拙的编译器静音,该编译器给出有关转换范围缩小的警告。 C11/C18 Annex I:
在许多情况下,一种实现可能会生成警告,但均未指定为该国际标准的一部分。以下是一些较常见的情况。
[...]
遇到隐式变窄转换,例如将long int或double分配给int,或
int comparator(const void *a, const void *b)
{
int sa = ((const struct foo *)a)->bar;
int sb = ((const struct foo *)b)->bar;
return (sa > sb) - (sa < sb);
}
或
int comparator(const void *a, const void *b)
{
const struct foo *sa = a;
const struct foo *sb = b;
return (sa->bar > sb->bar) - (sa->bar < sb->bar);
}
-它们的按键数量几乎相等。
对于第二种情况,您只需要避免使用此类编译器,或尝试使用某些开关来消除这种困扰。
void*
时,可以将其隐式转换为任何指针类型。 void*
double*
,也不适用于int
,甚至不能用作指针。添加演员表时,将展开允许的输入类型集。突然,any指针就有资格进行转换
以及任何整数类型
。现在,如果将int
转换为myStruct*
,会发生什么?究竟。废话。您希望编译器对此抛出错误。同样,如果您有一个指针,并且将其隐式转换为void*
,则仅适用于指针(和0
文字)。如果添加强制类型转换,则会丢失该值实际上是指针的检查。现在,在输入char
的情况下,转换也可以正常工作。
'a'
转换为指针时会发生什么?究竟。废话。您希望编译器对此抛出错误。所以,请不要添加不必要的演员表。它们总是会扩大编译器无法捕获错误的可能性。如果必须通过void*
传递指针,请确保该指针仅适用于指针。
void*