我已经在OpenCL C中编写了代码以列出所有可用平台。
int main()
{
cl_context context;
cl_platform_id* platforms;
cl_device_id* devices;
cl_uint platformcount;
cl_int ret;
clGetPlatformIDs(2,NULL,&platformcount);
clGetPlatformIDs(platformcount,platforms,NULL);
/*if(ret==CL_SUCCESS)
{
printf("\nNumber of platforms found=%d\n",platformcount);
}*/
return 0;
}
这导致转储核心(分段故障(转储核心))。
$ gcc -lOpenCL a.c -o a && ./a
Segmentation fault (core dumped)
但是,如果我注释掉ret声明,则代码可以正常编译。
int main()
{
cl_context context;
cl_platform_id* platforms;
cl_device_id* devices;
cl_uint platformcount;
//cl_int ret;
clGetPlatformIDs(2,NULL,&platformcount);
clGetPlatformIDs(platformcount,platforms,NULL);
/*if(ret==CL_SUCCESS)
{
printf("\nNumber of platforms found=%d\n",platformcount);
}*/
return 0;
}
为什么会这样?
最佳答案
这个电话
clGetPlatformIDs(platformcount,platforms,NULL);
写入
platforms
指向的位置,但是platforms
尚未初始化为指向任何位置,因此该调用调用UB。关于c - 在OpenCL C中声明cl_uint变量会导致段错误(核心转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31043892/