如何获取变量地址的地址(&&是编译器错误)?

Eri*_*oma 0 c pointers cuda

我有一个简单的问题,我似乎无法在网上找到.

我正在使用CUDA做一些GPU工作,我需要在GPU上分配一些数据.cudaMalloc函数如下:

cudaMalloc(void** identifier, size_t space);
Run Code Online (Sandbox Code Playgroud)

很容易.所以,让我们分配一个整数.

int i = 5;
cudaMalloc((void**)&(&i), sizeof(int));
Run Code Online (Sandbox Code Playgroud)

但是这个错误("表达式必须是左值或函数指示符").明显的解决方法是声明i为开头的指针,然后获取它的地址,并且完全正常; 我只是讨厌变通办法.

我觉得这个问题应该有一个明显的答案-毕竟**,***即使**********在C.工作得很好,所以,我怎么得到一个变量的地址的地址"干净"?

谢谢!

Ern*_*ill 5

不是一种解决方法; 这是正确的方法.

该函数需要指针的地址int,因为它将指针指向int它刚刚分配的指针.因此,您需要一个真实的分配指针的地址.像"&& i"这样的表达式要求编译器为你提供i的地址 - 这是一个纯数字,没有存储位置 - 然后给你一个指向该值的指针,当然它不能这样做.

所以你想说

int *p;
cudaMalloc((void**)&p, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

现在*pint已分配.

  • @R:答案不仅不正确,整个CUDA运行时API都是基于那种类型的强制转换.结果`*p` hold实际上是另一个内存空间*(GPU)中的*地址,并且在CUDA内部完成了各种内部事务,以保证在主机CPU上表示`int*`和` GPU上的void*`总是一样的. (3认同)