7 回答 7
This answer is useful
17
你没有。void*将隐式转换为您在 C 中需要的任何内容。另请参阅C 常见问题解答,了解为什么要明确避免在 C 中转换 malloc 的返回。@Sinan 的回答进一步说明了为什么不一致地遵循了这一点。
于 2009-10-27T22:59:42.833 回答
This answer is useful
6
因为 malloc 返回一个指向 void 的指针,也就是说,它只是分配内存块,而不考虑将存储在那里的数据。在 C++ 中,您返回的 void* 不会隐式转换为您的类型的指针。在您的示例中,您没有转换 malloc 返回的内容。Malloc 返回了一个 void*,它被隐式转换为 char*,但在下一行你......好吧,它不再有意义了。
于 2009-10-27T22:57:59.947 回答
This answer is useful
6
C FAQ 列表是一个非常宝贵的资源:为什么有些代码会小心地将 malloc 返回的值转换为正在分配的指针类型?.
于 2009-10-27T23:05:21.297 回答
This answer is useful
4
这是使“C++ 是 C 的超集”这一说法不完全正确的少数问题之一。在 C 中,void指针可以隐式转换为任何其他类型的指针。但是,C++ 对类型安全性要求更严格一些,因此您需要将 of 的返回值显式malloc转换为适当的类型。通常,这不是什么大问题,因为 C++ 代码倾向于使用new而不是malloc,它不需要类型转换。
于 2009-10-27T23:06:17.240 回答
This answer is useful
3
在 C 中,从 malloc 转换结果是不必要的,不应该这样做。例如,这样做可以掩盖 has failed to 的错误#include
在 C++ 中,您必须强制转换 malloc 的结果以将其分配给指向除 void 之外的任何类型的指针。但是,除非您确实需要编写可以编译为 C 或 C++ 的代码,否则您通常应该malloc完全避免在 C++ 中使用并使用new.
于 2009-10-27T23:06:25.490 回答
This answer is useful
1
您倾向于从新手(或 C++ 编码员 :-) 那里看到这种 C 代码:
int main() {
int len = 40;
char *my_string = (char *) malloc(sizeof(char)*len);
return 0;
}
这是不必要的和邪恶的,你可以通过包括避免无用的演员表stdlib.h
#include
int main() {
int len = 40;
char *my_string = malloc(sizeof(char)*len);
return 0;
}
于 2009-10-27T23:07:51.477 回答
This answer is useful
-1
您应该在使用 malloc 命令后强烈考虑强制转换,因为它提供了更大的可移植性和与程序其他部分的更大兼容性。如果您不这样做,您可能会面临数据类型不兼容的风险,从而导致错误。
于 2015-10-25T13:48:13.650 回答