为什么有必要转换为void **(例如在cudaMalloc调用中)?

时间:2016-06-10 05:20:43

标签: c pointers cuda void-pointers

cudaMalloc()函数defined使用:

cudaMalloc ( 
  void ** devPtr, 
  size_t size)

响应herehere很好地解释了为什么应该定义函数来接受指向指针的指针。

然而,我不太清楚为什么我们需要在调用函数类型为void **时输入我们提供的参数。例如。在调用函数时:

catch_status = cudaMalloc((void**)&device_array, num_bytes);

提出here

据我了解,定义一个接受void类型的函数可以提供更大的灵活性。即看一下cudaMalloc()函数的定义,我将其解释为它可以接受指向任何类型对象的指针。因此,为什么在调用函数时需要输入强制转换&device_array(在上面的示例中)。 (这种类型转换的语法似乎在我在整个网络中看到的cudaMalloc()示例中非常普遍)。只要&device_array满足它是“指向任何类型数据的指针的指针”的条件,就不足以(a)满足参数的函数定义cudaMalloc()接受和(b)实现我们的任何计划目标?

我在这里缺少什么?

1 个答案:

答案 0 :(得分:7)

转换为void**始终是错误的,因为此类型不是generic pointer

因此,当函数具有类型void**的参数时,传递给它的唯一类型的参数可以是类型:void**,使得任何强制转换都是错误的或不必要的。

从cudaMalloc获取内存的正确方法(忽略错误检查)是:

void* mem;
cudaMalloc( &mem , num_int_bytes );
int* array = mem;

cudaMalloc( &mem , num_double_bytes );
double* floating = mem;