C 与 C++,void** 指针的处理

Mar*_*lli 1 c c++ void-pointers

我发现使用 C 编译器,下面的代码可以工作,但不能使用 C++ 编译器。我知道强制转换void**为正确的用法,但我不明白为什么即使我使用void*(注释掉)它也会用 C 编译器编译。

#include <stdio.h>

int fn(void **arg)
{
    int *pvalue = *(int**)arg;
    *pvalue = 200;
    return 0;
}

int main()
{
    int value = 99;
    int *pvalue = &value;

    // fn((void *)&pvalue);  // works only in C
    // error C2664: 'int fn(void **)': cannot convert argument 1 from 'void *' to 'void **'

    fn((void **)&pvalue);    // correct, works for both C/C++

    printf("%d", value);
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

Vla*_*cow 5

在 C 中,允许将类型void *的指针分配给其他类型的指针。这发生在此调用中

fn((void *)&pvalue)
Run Code Online (Sandbox Code Playgroud)

其中参数具有void *分配给具有类型的函数参数的类型void **

int fn(void **arg)
{
    int *pvalue = *(int**)arg;
    *pvalue = 200;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,这样的分配通常是不安全的。例如,void * 类型的指针的值无法正确对齐以分配给其他类型的指针。

因此决定不允许在 C++ 中进行这样的赋值以使程序更安全。