c - 为什么我们需要强制转换 malloc 返回的内容?

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 ,因此您在范围内没有 malloc 的原型。反过来,这可能导致其他错误和缺乏可移植性(尽管在这方面最严重的违规者现在大多已过时)。

在 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 回答