C ++得到错误C2440

时间:2014-08-07 15:35:21

标签: c++ c visual-c++

您好我使用的是Visual Studio c ++ 2010

我对此代码有疑问(它取自C语言代码):

MEMBLOCK* create_memblock (HANDLE hProc,  MEMORY_BASIC_INFORMATION *meminfo)
{

    MEMBLOCK *mb = malloc(sizeof(MEMBLOCK));

    if (mb)
    {
        mb->hProc = hProc;
        mb->addr = meminfo->BaseAddress;
        mb->size = meminfo->RegionSize;
        mb->buffer = malloc(meminfo->RegionSize);
        mb->next = NULL;

    }
    return mb;
}

我有这些错误:

error C2440: 'initializing' : cannot convert from 'void *' to 'MEMBLOCK *'          
error C2440: '=' : cannot convert from 'PVOID' to 'unsigned char *'    
error C2440: '=' : cannot convert from 'void *' to 'unsigned char *'

我有点新手。你能否提供一个转换后的代码,它实际上适用于c ++。

谢谢

3 个答案:

答案 0 :(得分:3)

在C ++中您可能不会将类型为void *的指针分配给其他类型的指针。所以例如而不是写

MEMBLOCK *mb = malloc(sizeof(MEMBLOCK));

你必须写

MEMBLOCK *mb = ( MEMBLOCK * )malloc(sizeof(MEMBLOCK));

此外,您还必须更改存在相同问题的其他语句。看来这些陈述是

mb->addr = ( unsigned char * )meminfo->BaseAddress;
mb->buffer = ( unsigned char * )malloc(meminfo->RegionSize);

这是一个很好的例子,你总是应该在C中使用显式转换。这使得代码更加安全和清晰。

答案 1 :(得分:3)

由于您使用C ++编程,因此不应使用旧的C函数malloc。相反,我建议您使用C ++ new构造:

MEMBLOCK *mb = new MEMBLOCK;

答案 2 :(得分:2)

malloc()返回void*,C ++不会自动将void*转换为不同的指针类型。所以你必须转换返回值:

MEMBLOCK *mb = (MEMBLOCK*) malloc(sizeof(MEMBLOCK));

尝试:

MEMBLOCK* create_memblock (HANDLE hProc,  MEMORY_BASIC_INFORMATION *meminfo)
{
    MEMBLOCK *mb = (MEMBLOCK*)malloc(sizeof(MEMBLOCK));

    if (mb)
    {
        mb->hProc = hProc;
        mb->addr = meminfo->BaseAddress;
        mb->size = meminfo->RegionSize;
        mb->buffer = malloc(meminfo->RegionSize);
        mb->next = NULL;

    }
    return mb;
}