0

我有一个快速的问题,我似乎无法在网上找到。

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

cudaMalloc(void** identifier, size_t space);

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

int i = 5;
cudaMalloc((void**)&(&i), sizeof(int));

但是这个错误(“表达式必须是左值或函数指示符”)。明显的解决方法是先声明i为一个指针,然后获取它的地址,这非常好;我只是讨厌变通方法。

我觉得这个问题应该有一个明显的答案 - 毕竟,**,***甚至**********在 C 中工作得很好。那么,我如何“干净地”获取变量地址的地址?

谢谢!

4

3 回答 3

5

不是解决方法。这是正确的做法。

该函数需要指向 的指针的地址int,因为它将将该指针设置为指向int它刚刚分配的一个。因此,您需要一个真实的已分配指针的地址。像“&&i”这样的表达式要求编译器给你 i 的地址——这是一个纯数字,没有存储位置——然后给你一个指向那个值的指针,这当然是做不到的。

所以你想说

int *p;
cudaMalloc((void**)&p, sizeof(int));

现在*pint分配的。

于 2012-06-12T02:06:00.343 回答
1

获取地址的地址是不可能的。只有对象有地址,地址不是对象。您可以将地址分配给指针(这是一个对象),然后获取该指针的地址,这就是您所说的“解决方法”。

于 2012-06-12T02:10:01.930 回答
0

您无法获得对引用的引用,因为&i它没有存储在任何地方,您无法访问它的内存位置,因为它不存在。

您应该使用指向 int 的指针。

int *i = calloc(sizeof(int),1);

那么它的引用将是存储在某处的指针变量的地址。当然,如果指针需要在范围之外有效,则不能在本地范围内执行此操作,因为您将在堆栈上进行分配。

于 2012-06-12T02:07:43.283 回答