我通常在C语言中强制转换为void指针吗?

问题描述 投票:2回答:2

在关于C Do I cast the result of malloc?的投票最多的问题之一中,据说您不需要强制转换void函数或其家族成员之一的返回的malloc()指针,因为自从标准以来,它可以省略,可能会引起一些问题。

但是一般来说,void指针的转换如何?与投射void指针的一般方法有什么区别?

  • 我是否将void指针强制转换为C语言中的另一种类型的指针?
  • 在C中,我有没有放置过void指针的地方?
c pointers casting void
2个回答
4
投票

在两种情况下,您需要强制转换:

    <<
  • 使一个笨拙的编译器静音,该编译器给出有关转换范围缩小的警告。 C11/C18 Annex I

    1. 在许多情况下,一种实现可能会生成警告,但均未指定为该国际标准的一部分。以下是一些较常见的情况。
  • [...]

  • 遇到隐式变窄转换,例如将long int或double分配给int,或

      指向void的指针指向除字符类型以外的任何类型的指针
  • (6.3)。
  • 对于第一部分:您几乎总是可以使用一个临时变量。例如,您可以编写
  • 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*传递指针,请确保该指针仅适用于指针。


    0
    投票
    仅适用于void*
    © www.soinside.com 2019 - 2024. All rights reserved.