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

时间:2012-06-12 02:02:18

标签: c pointers cuda

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

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

cudaMalloc(void** identifier, size_t space);

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

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

但是这个错误(“表达式必须是左值或函数指示符”)。明显的解决方法是将i声明为开头的指针,然后获取它的地址,这样就可以了。我只是讨厌变通办法。

我觉得这个问题应该有一个明显的答案 - 毕竟,*****甚至**********在C中工作正常。那么,我该如何获得地址变量'cleanly'的地址?

谢谢!

3 个答案:

答案 0 :(得分:5)

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

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

所以你想说

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

现在*p是已分配的int

答案 1 :(得分:1)

无法获取地址。只有对象具有地址,并且地址不是对象。您可以为指针(这是一个对象)分配一个地址,然后获取该指针的地址,这就是您所描述的“解决方法”。

答案 2 :(得分:0)

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

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

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

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