我们为什么要转换malloc的返回值?

时间:2013-11-20 11:14:55

标签: c malloc

有人可以向我解释为什么有些程序员在malloc前面使用(char *)?我知道它返回void但为什么我要它只返回char内存?对不起,我只是编程的新手。谢谢

4 个答案:

答案 0 :(得分:29)

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

  

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

他们做错了(最有可能)通过施展(以优秀的程序员的意见)。

正如 wiki 所说:

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

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 ++
  •   
  • 演员阵容允许最初返回malloc的1989年之前的版本char *
  •   
  • 如果目标指针类型发生变化,则Casting可以帮助开发人员识别类型大小调整中的不一致性,特别是如果指针远离malloc()调用。
  •   

铸造的缺点:

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

<子> 1。重点是我的。

答案 1 :(得分:2)

由于malloc的返回类型为void *,当您将结果分配给指针时,它会隐式转换为新类型。因此,不需要显式铸造。实际上,不鼓励使用显式强制转换,如here所述。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

malloc()返回void*,因为malloc()不知道其调用者将如何使用它在堆上分配的内存。 因此,您可以将调用者(void*)转换为您想要在内存中使用的相应类型的指针。 (int*)存储整数。 (char*)存储字符等。

话虽如此,您不必明确转发malloc()来电。在某些情况下,这样做可能会导致错误。

请在此处阅读此问题

What's wrong with casting malloc's return value?

Specifically, what's dangerous about casting the result of malloc?