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

时间:2009-10-27 22:56:26

标签: c malloc heap

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

*我创建了一个名为String

的结构

7 个答案:

答案 0 :(得分:15)

你没有。 void*将隐式地转换为C中你需要的任何内容。另请参阅C FAQ,了解为什么要明确避免在C中转换malloc的返回。@ Sinan的答案进一步说明了为什么不一致地遵循了这一点。 / p>

答案 1 :(得分:6)

因为malloc返回一个指向void的指针,即它只是分配内存块而不考虑将存储在那里的数据。在C ++中,您返回的void *不会隐式地转换为您的类型的指针。在您的示例中,您还没有转换malloc返回的内容。 Malloc返回了一个void *,它被隐式地转换为char *,但是在下一行你...好吧,它再也没有多大意义了。

答案 2 :(得分:6)

答案 3 :(得分:3)

这是使“C ++是C的超集”这一陈述的少数问题之一并非完全正确。在C中,void指针可以隐式地转换为任何其他类型的指针。但是,C ++对类型安全性要严格一些,因此您需要将malloc的返回值显式转换为适当的类型。通常,这不是什么大问题,因为C ++代码倾向于使用new而不是malloc,这不需要进行类型转换。

答案 4 :(得分:2)

在C中,从malloc转换结果是不必要的,不应该这样做。例如,这样做可以掩盖错误#include <stdlib.h>的错误,因此您没有范围内的malloc原型。反过来,这可能导致其他错误和缺乏可移植性(尽管这方面最严重的违规者现在已经过时了)。

在C ++中,必须转换malloc的结果,将其分配给指向void以外的任何类型的指针。但是,除非您真的需要编写可以编译为C或C ++的代码,否则通常应该避免在C ++中使用malloc并使用new分配内存。

答案 5 :(得分:1)

您倾向于从新手(或C ++编码员:-))看到这种C代码:

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

这是不必要的和邪恶的,你可以通过包括stdlib.h

来避免无用的演员表
#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}

答案 6 :(得分:0)

使用malloc命令后,您应该强烈考虑进行强制转换,因为它提供了更高的可移植性以及与程序其他部分的更好兼容性。如果不这样做,您可能会遇到可能导致错误的不兼容数据类型的风险。