C++ 使用malloc()和sizeof()在堆上创建结构

C++ 使用malloc()和sizeof()在堆上创建结构,c++,C++,我试图使用malloc()和sizeof()在堆上创建一个结构。这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> struct Employee { char first[21]; char last[21]; char title[21]; int salary; }; struct Employee* createEmployee(ch

我试图使用malloc()和sizeof()在堆上创建一个结构。这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Employee
{
    char first[21];
    char last[21];
    char title[21];
    int salary;
};


struct Employee* createEmployee(char* first, char* last, char* title, int salary) // Creates a struct Employee object on the heap.
{
    struct Employee* p = malloc(sizeof(struct Employee)); 

    if (p != NULL)
    {
        strcpy(p->first, first);
        strcpy(p->last, last);
        strcpy(p->title, title);
        p->salary, salary;
    }
    return p;

}
#包括
#包括
#包括
结构雇员
{
字符优先[21];
char last[21];
字符标题[21];
国际工资;
};
struct Employee*createEmployee(char*first,char*last,char*title,int salary)//在堆上创建一个struct Employee对象。
{
struct Employee*p=malloc(sizeof(struct Employee));
如果(p!=NULL)
{
strcpy(p->first,first);
strcpy(p->last,last);
strcpy(p->title,title);
p->工资,工资;
}
返回p;
}
没有我的编译器(Visual C++)告诉我行
struct Employee*p=malloc(sizeof(struct Employee))类型“void*”无法转换为类型“Employee*”。我不知道这里怎么了。好像Strut Engess是一个空洞,但我不明白为什么在C++中……/P>< P>(因为你正在使用VisualC++编译),你必须显式地转换由<代码> MalOC/<代码>返回的指针:

struct Employee* p = (struct Employee*) malloc(sizeof(struct Employee));
struct Employee *p = malloc(sizeof *p); 

您应该将malloc的结果强制转换为您正在使用的指针类型

struct Employee* p = (struct Employee*)malloc(sizeof(struct Employee)); 

malloc
将始终以
(void*)
的形式返回一个chunck内存。由您来告诉编译器内存是什么类型的chunck。

malloc
返回的值是
void*
。要分配给
p
的值必须是
Employee*
类型。在C++中(与C相反),没有从“代码>空洞*/COD>”到另一个指针类型的隐式转换。因此,您需要显式执行转换:

struct Employee* p = reinterpret_cast<Employee*>(malloc(sizeof(struct Employee))); 
struct Employee*p=reinterpret_cast(malloc(sizeof(struct Employee));

如果您是以C代码进行编译,则该行应该有效

<>但在C++中,从<> >空> */C> >→代码>雇员*<代码>无效。 文件名是否为something.c?是否有可以更改的编译器选项

如果必须使用C++编译器,可以通过添加显式CAST:

来修复这个问题。
struct Employee* p = (struct Employee*)malloc(sizeof(struct Employee));

使用
malloc
的最佳实践:

struct Employee* p = (struct Employee*) malloc(sizeof(struct Employee));
struct Employee *p = malloc(sizeof *p); 
你还需要修复你的IDE编译器,告诉它你在写C而不是C++,因为它太坏了,不能自己去理解……/P> 既然有些人似乎对这个答案不满意(我也不赞成其他答案),我想我应该解释一下为什么解决这个问题是不好的


在C语言中,强制转换malloc的返回值是有害的,因为如果忘记包含stdlib.h或原型malloc,它会隐藏警告。它还使代码更难维护;如果p的类型需要更改,所有带cast的答案都需要进行3次更改,而我的答案只需要在一个位置进行更改。最后,新的C程序员不应该养成在看到编译器警告或错误时使用强制转换的坏习惯。这通常只是埋下虫子。正确的代码几乎不需要强制转换,它们的使用应该被看作是代码嗅觉

不告诉我Visual C++不能够编译C代码作为C代码。非常感谢。这很有效。当计时器准备好的时候,我会接受你的回答。@阿斯切勒:它能做到这一点,但默认情况下它不会这样做,除非文件有<代码> .c/c>扩展。@ SeopPube是,但是我忘记了我的头上的标志/设置。如果这是C代码,不要编写无用和有害的铸件来让C++编译器高兴。修正IDE的设置,告诉你写的是C而不是C++。正如一般的技巧,当编译器告诉你一个类型不能转换成另一个类型时,它通常意味着你的任务的右手边不是和你左手边的类型相同,而不是相反。所以,这个错误告诉你,你的右手边是错误的类型。这将有助于你将来缩小范围。除了分配等问题,请注意
p->salary,salary可能不是你想要的。@克拉瓜迪亚:一般来说,这是不错的建议,但与OP的问题无关。OP的问题基本上是C、C++的等价于写<代码>!usr/bin/perl
位于Bourne shell脚本的顶部。如何准确地解释编译错误?了解您使用的语言。不是C++。如果你只打算写C,你就要有智慧使用C编译器来构建它。那么你就不会有这些问题了。或者更好的解决方法(学习如何使用C++和创建构造函数)。不,OP应该修复IDE编译器的设置,或者修正他的问题,而不是C++,如果他真的打算使用C++(但是为什么你在C++中使用<代码> MalOC ?)它不是一个设置问题。如果他的文件是.c,那么它将使用c编译器编译。如果它是.cp,它将用C++编译器编译。写C++和用C++编译器编译它是有效的,但是类型只是编译器的一个更大的部分。如果你要这样做的话,只写一个特定的C子集(C和C++的交集)是有效的,它需要你写非常糟糕的C代码。不是这样。C++编译器被指定为它应该能够编译所有的C。一些C++编译器没有正确编译C是执行的错误。对于下级者,在你给出的一个坏答案上“1”的报复是非常成熟的……下落者是我,而下一次投票的部分原因是你的答案的不足(部分),部分原因是我相信所有现有答案都是下流的。(包括我的)的形式真的很糟糕。想讨论一下吗?当所有现有的答案都是同一件事的重复,并且都忽略了OP的真正问题(编译为错误的语言)给一个丑陋的解决方案,什么会比所有的投票都好?只是第一个投票否决了我自己的业务?很好。我已经修正了这个问题的标签,但是我仍然认为接受的答案是坏的建议。