例如, cudaMalloc((void**)&device_array, num_bytes);
之前已经问过这个问题,回复是"因为cudaMalloc返回错误代码",但是我没有得到它 - 什么有双指针与返回错误代码有什么关系?为什么一个简单的指针不能完成这项工作?
如果我写
cudaError_t catch_status;
catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)
错误代码将被放入catch_status,并返回一个指向分配的GPU内存的简单指针就足够了,不应该吗?
我已经阅读了 有关Stack Overflow RE的各种文章 :取消引用类型标记的指针错误。我的理解是,该错误本质上是编译器警告,它警告通过不同类型的指针访问对象的危险(尽管似乎为产生了例外),这是可以理解且合理的警告。 char*
我的问题特定于以下代码:为什么将指针的地址强制转换void**为此警告的合格字符(通过导致错误-Werror)?
而且,此代码针对多个目标体系结构进行了编译,只有其中一种会生成警告/错误-这是否暗示它合法地是特定于编译器版本的缺陷?
// main.c
#include <stdlib.h>
typedef struct Foo
{
int i;
} Foo;
void freeFunc( void** obj )
{
if ( obj && * obj )
{
free( *obj );
*obj = NULL;
}
}
int main( int argc, char* argv[] )
{
Foo* f = calloc( 1, sizeof( Foo ) );
freeFunc( (void**)(&f) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果上述我的理解是正确的,a void**仍然只是一个指针,这应该是安全的。
有没有不使用左值来解决此编译器特定警告/错误的解决方法?也就是说,我理解这以及为什么这可以解决问题,但是我想避免这种方法,因为我想利用 …
关于使用的另一个问题有这个答案cudaMalloc((void**)&device_array, num_bytes),它void**用作输出参数而不是void*像标准那样传递一个返回值malloc.
它批评了NVIDIA的API并声明:
如(void**)和device_array中的转换是无效的C并导致未定义的行为.
并且已被多次投票(截至目前为8),所以我认为其中有一些道理.
我不明白在那里铸造有什么问题.
我所知道的是,它在没有警告的情况下进行编译,并按照预期的行为运行.但我对C达到标准规格水平并不了解.
该cudaMalloc()函数使用以下定义:
cudaMalloc (
void ** devPtr,
size_t size)
Run Code Online (Sandbox Code Playgroud)
这里和这里的响应很好地解释了为什么应该定义函数来接受指向指针的指针.
但是,我不太清楚为什么我们需要在调用函数类型为void**时输入我们提供的参数.例如,在函数调用中:
catch_status = cudaMalloc((void**)&device_array, num_bytes);
Run Code Online (Sandbox Code Playgroud)
呈现在这里.
据我了解,定义一个接受void类型的函数可以提供更大的灵活性.即看看cudaMalloc()函数的定义,我将其解释为它可以接受指向任何类型对象的指针.因此,为什么&device_array在调用函数时需要输入强制转换(在上面的例子中).(这种类型转换的语法在cudaMalloc()我在整个网络中看到的例子中似乎非常普遍).只要&device_array满足它是"指向任何类型数据的指针"的条件,就不足以(a)满足参数cudaMalloc()接受的函数定义和(b)完成我们的编程目标吗?
我在这里错过了什么?
我在第二个cudaMalloc之后获得了一个分段错误.
#include <cuda.h>
#include <cuda_runtime.h>
int main(){
int n=16;
float2* a;
cudaMalloc((void **) a, n*sizeof(float2));
float2* b;
cudaMalloc((void **) b, n*sizeof(float2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我注释掉2个cudaMalloc中的任何一个,那么代码运行正常.
谢谢!