我一直在通过不同的编译器运行以下代码:
int main()
{
float **a;
void **b;
b = a;
}
Run Code Online (Sandbox Code Playgroud)
从我已经能够收集,void **是不是一个普通的指针,这意味着从另一个指针任何转换不应该编译或至少抛出一个警告。但是,这是我的结果(全部在 Windows 上完成):
我的问题是:我是否遗漏了整件事,MSVC 不产生警告有什么具体原因吗?MSVC做转换时产生警告从 void **到float **。
另一件值得注意的事情:如果我a = b用显式转换替换a = (void **)b,则编译器都不会发出警告。我认为这应该是一个无效的演员,那么为什么没有任何警告呢?
我问这个问题的原因是因为我开始学习 CUDA 和官方编程指南(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory)可以找到以下代码:
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
Run Code Online (Sandbox Code Playgroud)
它应该执行到void **for的隐式转换&d_A,因为的第一个参数cudaMalloc是类型void **。类似的代码可以在整个文档中找到。这只是 …