(void **)& x和(void *)x有什么区别?

时间:2012-08-13 02:21:40

标签: c pointers cuda gpgpu gpu-programming

(void **)& x和(void *)x之间有什么区别?我会给你一些代码,请帮帮我。

float *xd;
int size=width*width*size(float);
cudaMalloc((void **)&x,size); 1
cudaMalloc((void *)x,size);   2
cudaMalloc(&x,size);          3
cudaMalloc(*x,size);          4

cudaFree(xd);

我只想知道其中的差异。

cudaMalloc()函数的第一个参数是指针变量的地址,它必须在分配后指向分配的对象。指针变量的地址应该转换为(void **),因为函数需要一个通用指针值;内存分配函数是一个通用函数,不限于任何特定类型的对象。此地址允许cudaMalloc()函数将已分配对象的地址写入指针变量.3 cudaMalloc()函数的第二个参数以字节为单位给出要分配的对象的大小。第二个参数的使用与C malloc()函数的size参数一致。

2 个答案:

答案 0 :(得分:6)

他们只是完全不同。

此:

(void **)&x

获取x的地址并将其转换为void**(指向void的指针)。

此:

(void *)x

获取x并将其转换为void*

它们都是指针,但它们指向内存中完全不同的位置(除非x碰巧包含自己的地址),并且它们的类型不同。

如果您想向我们展示代码,向我们展示实际编译的代码会很有帮助。复制并粘贴您的实际源代码;不要重新输入它。您尚未向我们展示x的声明(xd的拼写是x?),而size(float)是语法错误(您的意思是{{1} }?)。

答案 1 :(得分:2)

为了让您更好地了解为什么 cudaMalloc您经常撰写(void**)&var,请考虑以下事项:

cudaMalloc在GPU上分配内存。它所引用的内存类型是void*,因为它并不真正关心数据类型。

一旦我们在刚刚分配的cudaMalloc内有了该内存的地址,我们就需要以某种方式将它返回给调用者。但是所有CUDA API函数都返回错误代码(或成功代码),任何其他返回的数据都必须通过参数引用传回。

C语言没有pass-by-reference,所以你实际上需要将指针传递给你希望函数存储结果的变量。由于您要存储指针值,因此需要传递指针指针。因此void**类型。

如果想以类似的方式封装malloc,可以写下这样的东西:

void myMalloc(void** ret, size_t size) {
    void* mem = malloc(size);
    *ret = mem;
}

现在,如果您将(void**)&var传递给myMalloc,该函数将能够覆盖var的值 - 因为ret将指向{ {1}}变量。

这是否更清晰?