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

use*_*799 9 c malloc

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

hac*_*cks 29

无需转换返回值malloc作为其返回类型void*.

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

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

正如维基所说:

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

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++ */
Run Code Online (Sandbox Code Playgroud)

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

铸造的优点:

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

铸造的缺点:

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

1.重点是我的.

  • "因为它的返回类型是无效的." 我想你想说"无效*" (4认同)