我不明白为什么以下简单代码在c [0] = d
时失败了void test(char **a){
char **c;
cudaMemcpy(c,a, sizeof(char*), cudaMemcpyDeviceToHost);
char temp[2];
for(int i = 0 ; i< 2; i++){
temp[i ] = temp[i] & 0 ;
}
char *d;
cudaMalloc((void**)&d, 2*sizeof(char));
cudaMemcpy(d, temp, 2 * sizeof(char), cudaMemcpyHostToDevice);
c[0] = d;
}
void main(){
char **a ;
cudaMalloc((void**)&a, sizeof( char*));
test(a);
}
答案 0 :(得分:1)
您忘了为char **c
分配内存。因此,在引起错误的行中,c
是一个“死指针”,即等于NULL或指的是不属于您的程序的内存部分。换句话说,c
指向一个空的,未分配的C字符串数组。解决c[0]
元素(假设是数组中的第一个字符串,不存在)是非法的,并且会给你一个分段错误,因为你试图写一些东西(d
的值)到你不拥有的地方。
解决方案是在写入c[0]
之前分配内存:
c = new char *; //or "c = new char [5]" if you want it to hold more strings
c[0] = d;
还记得你如何调用CudaMalloc()在GPU上为a
和d
变量分配内存?您只需对c
执行相同操作,但需要在主RAM中(即在主机上)
希望它有所帮助。
答案 1 :(得分:0)
首先,从代码中可以清楚地知道你要做什么,或许将其添加到Q中会有所帮助。那么你从编译器得到的错误信息到底是什么?
至于失败,可能是编译器不喜欢你试图使用c
访问[]
,因为它没有被声明为数组。我原则上知道它应该有效,但尝试使用*c = d
。这有帮助吗?
P.S。我个人总是使用命名法devFoo
来指示设备内存的任何指针,所以我不会感到困惑,在一个更大的项目中,很容易忘记a
,b
或{ {1}}指向主机或设备内存。