我有一个简单的问题,我似乎无法在网上找到。
我正在使用CUDA做一些GPU工作,我需要在GPU上分配一些数据。 cudaMalloc功能如下:
cudaMalloc(void** identifier, size_t space);
够容易。所以,让我们分配一个整数。
int i = 5;
cudaMalloc((void**)&(&i), sizeof(int));
但是这个错误(“表达式必须是左值或函数指示符”)。明显的解决方法是将i
声明为开头的指针,然后获取它的地址,这样就可以了。我只是讨厌变通办法。
我觉得这个问题应该有一个明显的答案 - 毕竟,**
,***
甚至**********
在C中工作正常。那么,我该如何获得地址变量'cleanly'的地址?
谢谢!
答案 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);
然后它的引用将是一个存储在某处的指针变量的地址。当然,如果指针在范围之外也需要有效,则无法在本地范围内执行此操作,因为您将在堆栈上进行分配。