有人可以向我解释一下为什么有些程序员在 malloc 前面使用 (char*) 吗?我知道它返回 void 但为什么我希望它只返回 char 内存?抱歉,我只是编程新手。谢谢
无需转换返回值malloc
因为它的返回类型是void*
.
有人可以解释一下为什么有些程序员使用(char *)
在malloc前面?
他们通过强制转换(在好的程序员看来)做错了(很可能)。
As wiki http://en.wikipedia.org/wiki/C_dynamic_memory_allocation says:
malloc
returns a void pointer (void *
), which indicates that it is a pointer to a region of unknown data type. The use of casting is required in C++ due to the strong type system, whereas this is not the case in C1. The lack of a specific pointer type returned from malloc
is type-unsafe behavior according to some programmers: malloc
allocates based on byte count but not on type. This is different from the C++ new operator http://en.wikipedia.org/wiki/New_(C%2B%2B) that returns a pointer whose type relies on the operand.
One may "cast" this pointer to a specific type:
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 *
.
- 如果目标指针类型发生变化,转换可以帮助开发人员识别类型大小的不一致,特别是当指针声明的位置远离目标指针时。
malloc()
call.
铸造的缺点:
- 在 ANSI C 标准下,强制转换为多余的.
-
添加强制转换可能会掩盖包含标头的失败
stdlib.h
,其中原型为malloc
被发现。在没有原型的情况下malloc
,该标准要求 C 编译器假设malloc
返回一个 int。如果没有强制转换,则将此整数分配给指针时会发出警告;然而,通过强制转换,不会产生此警告,隐藏了一个错误。在某些架构和数据模型上(例如 64 位系统上的 LP64,其中 long 和指针是 64 位,int 是 32 位),此错误实际上可能会导致未定义的行为,因为隐式声明malloc
返回 32 位值,而实际定义的函数返回 64 位值。根据调用约定和内存布局,这可能会导致堆栈崩溃。在现代编译器中,这个问题不太可能被忽视,因为它们统一生成警告,指出已使用未声明的函数,因此仍然会出现警告。例如,GCC 的默认行为是显示一条警告,内容为“内置函数的不兼容隐式声明”,无论强制转换是否存在。
- 如果指针的类型发生更改,则必须修复其中的所有代码行
malloc
被调用并投射(除非它被投射到typedef
).
1. Emphases are mine.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)