假设我有以下内容:
void init_gpu(cuComplex* d_hhBuff)
{
cutilSafeCall(cudaMalloc((void **)&d_hhBuff, memsize));
}
我称之为
cuComplex *my_buff;
init_gpu(my_buff);
好吧,当init_gpu返回时,它没有指向cudaMalloc分配的设备内存。
如何修改这个以便init_gpu的调用者将my_buff指向cudaMalloc创建的修改后的d_hhBuff?
答案 0 :(得分:6)
问题是你是按值传递指针。将功能标题更改为
void init_gpu(cuComplex *& d_hhBuff)
答案 1 :(得分:2)
您的d_hhBuf
是本地副本。你应该做的是通过引用传递指针:
void init_gpu(cuComplex * & d_hhBuff)
答案 2 :(得分:0)
假设你输入type:
typedef cuComplex* ComplexPointer;
写一个函数:
void ChangeComplex(ComplexPointer ptr)
{
ptr = new cuComplex;
}
并称之为:
ComplexPointer cptr;
ChangeComplex(cptr);
通过查看通话和功能(以及不知道typedef)可以推断出什么?你会说,ptr
(cptr
)按值传递,而不是通过引用/指针传递,不会改变。
现在考虑这个电话:
cuComplex* ptr;
ChangeComplex(cptr);
这与上面完全相同,您实际上是传递类型ComplexPointer
- 它只是通过值传递。
最后了解更改后的签名:
void ChangeComplex(cuComplex*ptr);
它仍然是相同的 - 您通过VALUE传递类型 cuComplex*
,而不是通过引用!