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)
有人可以解释为什么会这样吗?
在 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++ 中进行这样的赋值以使程序更安全。