带有单个字符串地址的 OpenCL clCreateProgramFromSource() 段错误#included
OpenCL clCreateProgramFromSource() segfaults with address of single string #included
使用字符串 arg 在单个源上调用 clCreateProgramFromSource 设置#included 字符数组段错误的地址,但将数组作为字符指针数组的元素传递是可行的。
#include "prog_src.h"
const char *cl_srcs[1];
cl_srcs[0] = prog_src_cl;
cl.prog = clCreateProgramWithSource(cl.context, 1, cl_srcs, NULL, &err);
puts("test0");
cl.prog = clCreateProgramWithSource(cl.context, 1, &prog_src_cl, NULL, &err);
puts("test1");
“test0”将打印,然后程序出现段错误,我不确定为什么它不适用于第二个版本,prog_src_cl 是文件 #included 中的无符号字符 *。
任何帮助将不胜感激,因为我似乎无法理解为什么如此看似微不足道的事情无法按预期工作。
函数 clCreateProgramWithSource
期望通过参数 const char** strings
传递源。你说 prog_src_cl
是一个字符数组。这意味着 &proc_src_cl
是 const char (*)[N]
类型。 (指向常量字符的 N 元素数组的指针,其中 N 可能是用于初始化数组的字符串的长度,加上 1 作为 nul 终止字符。)这与 const char**
不同,您不能在它们之间安全地转换!
我建议您在 C 编译器中打开更多类型检查选项,例如将 -Wextra
传递给 clang 或 gcc。例如,clang 在 -Wincompatible-pointer-types
警告中捕获此编程错误,该警告包含在 -Wextra
.
中
使用字符串 arg 在单个源上调用 clCreateProgramFromSource 设置#included 字符数组段错误的地址,但将数组作为字符指针数组的元素传递是可行的。
#include "prog_src.h"
const char *cl_srcs[1];
cl_srcs[0] = prog_src_cl;
cl.prog = clCreateProgramWithSource(cl.context, 1, cl_srcs, NULL, &err);
puts("test0");
cl.prog = clCreateProgramWithSource(cl.context, 1, &prog_src_cl, NULL, &err);
puts("test1");
“test0”将打印,然后程序出现段错误,我不确定为什么它不适用于第二个版本,prog_src_cl 是文件 #included 中的无符号字符 *。
任何帮助将不胜感激,因为我似乎无法理解为什么如此看似微不足道的事情无法按预期工作。
函数 clCreateProgramWithSource
期望通过参数 const char** strings
传递源。你说 prog_src_cl
是一个字符数组。这意味着 &proc_src_cl
是 const char (*)[N]
类型。 (指向常量字符的 N 元素数组的指针,其中 N 可能是用于初始化数组的字符串的长度,加上 1 作为 nul 终止字符。)这与 const char**
不同,您不能在它们之间安全地转换!
我建议您在 C 编译器中打开更多类型检查选项,例如将 -Wextra
传递给 clang 或 gcc。例如,clang 在 -Wincompatible-pointer-types
警告中捕获此编程错误,该警告包含在 -Wextra
.