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

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

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

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

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

正如维基所说:

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(malloc(10 * sizeof (*ptr))); /* with a cast, for C++ */ 

执行这样的演员表有优点和缺点

铸造的优点:

  • 包括转换允许程序或函数编译为C ++
  • 演员版允许1989年之前版本的malloc最初返回char *
  • 如果目标指针类型发生更改,则转换可以帮助开发人员识别类型大小调整中的不一致,特别是如果指针远离malloc()调用。

铸造的缺点:

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

1.重点是我的。

由于malloc的返回类型为void *,因此在将结果分配给指针时,会将其隐式转换为新类型。 因此,不需要显式铸造。 实际上,不鼓励使用显式演员表,如此处所述。

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

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

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

话虽如此,您不必显式地转换malloc()调用的返回。 在某些情况下,这样做可能会导致错误。

请在这里阅读这个问题

铸造malloc的返回值有什么问题?

具体来说,铸造malloc的结果有什么危险?