C++ x=malloc(n*sizeof(int));无法将void转换为int

C++ x=malloc(n*sizeof(int));无法将void转换为int,c++,algorithm,sorting,C++,Algorithm,Sorting,我发现了一个计算合并排序执行时间的代码。我收到一个错误,上面写着“无法将void转换为int”。我从这段代码中得到的错误是x=malloc(n*sizeof(int)) 你应该像这样施放malloc x = (int *)malloc(sizeof(int) * n) 因为malloc只返回void指针,所以应该像这样强制转换malloc x = (int *)malloc(sizeof(int) * n) 因为malloc只返回空指针C++编译器比C编译器更严格。因此,并非所有的C代码都将

我发现了一个计算合并排序执行时间的代码。我收到一个错误,上面写着“无法将void转换为int”。我从这段代码中得到的错误是
x=malloc(n*sizeof(int))


你应该像这样施放malloc

x = (int *)malloc(sizeof(int) * n)

因为malloc只返回void指针

,所以应该像这样强制转换malloc

x = (int *)malloc(sizeof(int) * n)

因为malloc只返回空指针

C++编译器比C编译器更严格。因此,并非所有的C代码都将使用C++编译器编译,所以如果不使用任何C++特性,就不应该使用C++编译器。
malloc
返回一个
void*
,因此必须将其转换为相应的类型,前提是您使用的是C编译器:

Type * x = (Type *) malloc (sizeof(Type));

但是如果你必须使用C++和Maloc,那么就像评论中提到的,C风格的转换应该是最后的手段,你应该使用<代码> StasyType < /Calp>

Type * x = static_cast<Type *>(malloc(sizeof(Type)));
Type*x=static_cast(malloc(sizeof(Type));

C++编译器比C编译器更严格。因此,并非所有的C代码都将使用C++编译器编译,所以如果不使用任何C++特性,就不应该使用C++编译器。
malloc
返回一个
void*
,因此必须将其转换为相应的类型,前提是您使用的是C编译器:

Type * x = (Type *) malloc (sizeof(Type));

但是如果你必须使用C++和Maloc,那么就像评论中提到的,C风格的转换应该是最后的手段,你应该使用<代码> StasyType < /Calp>

Type * x = static_cast<Type *>(malloc(sizeof(Type)));
Type*x=static_cast(malloc(sizeof(Type));

由于这个问题用C++标记,所以我建议一个完全不同的解决方案:接受C++的力量,使用<代码> STD::向量< /代码>。p>

std::vector<int> descriptiveNameHere(n);
std::向量描述符名称(n);
这种方法使您无需手动管理内存分配。当
向量
被允许超出范围时,存储将自动释放


< /P> < P>由于这个问题用C++来标记,所以我建议一个完全不同的解决方案:接受C++的力量,使用<代码> STD::向量< /代码>。p>

std::vector<int> descriptiveNameHere(n);
std::向量描述符名称(n);
这种方法使您无需手动管理内存分配。当
向量
被允许超出范围时,存储将自动释放



C++和C在这里有所不同。C++对什么可以转换为什么有更严格的规则。code>void*
需要强制转换才能将其转换为
int*
。为什么在C++中使用<代码> MalCal?您应该发现新的
更易于使用。您应该提供一个。你发布的大部分代码都是无关的。一个三行程序将完成。现在你缺少了<代码> x>代码>的声明,这是很重要的。C++和C在这里不同。C++对什么可以转换为什么有更严格的规则。code>void*
需要强制转换才能将其转换为
int*
。为什么在C++中使用<代码> MalCal?您应该发现新的
更易于使用。您应该提供一个。你发布的大部分代码都是无关的。三行程序就可以了。现在您缺少了
x
的声明,这有点重要。在第一种情况下,他们不应该使用
malloc
。或者使用C编译器。@jingbe它可以工作,但是现在我在说Lingking..\SOURCE\MERGY时出错了。EXE@Leve这个错误可能是因为编译器或开发工具。尝试以C++方式重置您使用的工具:
x=newint[n]。C++的铸造方法:<代码> x= RealTytReST(Maloc([.]));<代码>。在第一种情况下,他们不应该使用
malloc
。或者使用C编译器。@jingbe它可以工作,但是现在我在说Lingking..\SOURCE\MERGY时出错了。EXE@Leve这个错误可能是因为编译器或开发工具。尝试以C++方式重置您使用的工具:
x=newint[n]。C++的铸造方法:<代码> x= RealTytReST(Maloc([.]));<代码>。它可以工作,但现在我在说Lingking..\SOURCE\MERGY时出错。EXE@Leve链接器错误很棘手,您必须提供更多信息当我编译它时,没有发现错误,并且在消息面板中可以看到,使用C样式转换应该是最后的选择。使用
static\u cast
@Leve,你是说你在执行程序时看到了这一点?然后它一定希望找到这个exe,但它找不到它,也许你应该检查你找到代码的链接它可以工作,但现在我得到一个错误,说Lingking..\SOURCE\MERGY。EXE@Leve链接器错误很棘手,你必须在我编译时提供更多信息,没有发现错误,在消息面板中可以看到,使用C样式转换应该是最后的选择。使用
static\u cast
@Leve,你是说你在执行程序时看到了这一点?然后它一定希望找到这个exe,但它没有找到它,也许你应该检查你找到代码的链接,而我当然同意在新代码中应该使用
std::vector
,它没有回答问题,甚至可能是错误的,因为不知道代码后面会发生什么。新分配的数组也可以传递给一个函数(该函数将不会编译),该函数拥有指针的所有权,并在以后删除它(这将是一个bug)。@GertWollny我知道代码的其余部分是什么;这是从某个地方复制的merge-sort-OP的C实现,它使用了一种不幸的方言字母汤。是的,OP还必须修改另一个函数以接受
向量
,但我仍然认为
向量
malloc
新的
更可取。有时,你不得不做X-Y检查,而不是提供一个直接的,但低劣的答案。我们不应该鼓励原始指针,尤其是
malloc
<代码>malloc
有其作用。不是这样的。这个答案存在的主要原因是其他答案都没有被提出来。
new