为什么我们要投入malloc的返回值?

这个问题在这里已经有了答案:

  • 我输入malloc的结果吗? 27个答案

  • 无需转换malloc返回值,因为它的返回类型是void*

    有人可以解释为什么一些程序员在malloc前使用(* char)?

    他们做错了(最有可能的)是通过投掷它(在好的程序员看来)。

    正如wiki所说:

    malloc返回一个void指针( void * ),它表示它是一个指向未知数据类型区域的指针。 由于强类型系统,在C ++中需要使用强制类型转换,而在C 1中则不然 。缺少从malloc返回的特定指针类型是根据某些程序员的类型不安全行为: malloc根据字节计数但不是类型。 这与返回一个类型依赖于操作数的指针的C ++ new运算符不同。 可以将这个指针“投”到一个特定的类型:

    int *ptr;
    ptr = malloc(10 * sizeof (*ptr));               /* without a cast */
    ptr = (int *)malloc(10 * sizeof (*ptr));        /* with a cast */
    ptr = reinterpret_cast<int *>(malloc(10 * sizeof (*ptr))); /* with a cast, for C++ */
    

    执行这样的演员有好处和坏处

    铸造的优点:

  • 包括转换允许程序或函数编译为C ++
  • 该转换允许1989年以前版本的malloc最初返回一个char *
  • 如果目标指针类型发生变化,Casting可以帮助开发人员确定类型调整中的不一致性,特别是如果远离malloc()调用声明指针。
  • 铸造的缺点:

  • 在ANSI C标准下,演员阵容是多余的
  • 添加转换可能会掩盖未能包含标头stdlib.h ,其中找到了malloc的原型 。 在没有malloc原型的情况下,该标准要求C编译器假定malloc返回一个int。 如果没有强制转换,则将此整数分配给指针时发出警告; 然而,在演员阵容中,这个警告并没有产生,隐藏了一个bug。 在某些体系结构和数据模型(如64位系统上的LP64,其中long和指针为64位且int为32位)中,此错误实际上可能导致未定义的行为,因为隐式声明的malloc返回32位bit值,而实际定义的函数返回一个64位值。 根据调用约定和内存布局,这可能导致堆栈粉碎。 在现代编译器中,这个问题不太可能被忽视,因为它们一致地产生警告,说明已经使用了未声明的函数,所以仍然会出现警告。 例如,GCC的默认行为是显示一条警告,该警告读取“不兼容的隐含声明的内置函数”,无论演员是否存在。
  • 如果指针的类型发生了变化,则必须修复所有调用malloc代码行并进行malloc (除非将其转换为typedef )。

  • 重点是我的。


    由于malloc的返回类型是void *,因此当您将结果分配给指针时,它将隐式转换为新类型。 所以,没有必要进行明确的转换。 实际上,如此处所述,不鼓励使用明确的演员阵容。


    malloc返回void * ,这是一个泛指针,可以指向任何类型的数据。 (char *)是一种明确的类型转换,将由malloc返回的指针从指针转换为任何内容,转换为指向char的指针。 这在C中是不必要的,因为它是隐式完成的,实际上建议不要这样做,因为它可以隐藏一些错误。

    如果您需要将代码编译为C ++,而不仅仅是C,那么您将需要显式转换,因为C ++不执行隐式转换。

    链接地址: http://www.djcxy.com/p/28419.html

    上一篇: Why do we cast return value of malloc?

    下一篇: php ZMQ push integration over http