为什么我们要投入malloc的返回值?
这个问题在这里已经有了答案:
无需转换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++ */
执行这样的演员有好处和坏处 。
铸造的优点:
malloc
最初返回一个char *
。 malloc()
调用声明指针。 铸造的缺点:
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