带有指针成员的结构体拷贝问题

下面这种结构体拷贝方法 我总觉得不对,但是结果却是正确的 ,为什么呢?
正确的使用方法是什么样的?
struct {int x1;
int x2;
int *p
} Dem;

Dem host;
host.p = new int[100];
host.p[1] = 1;

Dem* dev;

cudaMalloc( (void**)&dev, sizeof(Dem));
cudaMemcpy(dev, &host, sizeof(Dem), cudamemcpyhostodevice);

Dem temp;
cudaMemcpy(&temp, &dev, sizeof(Dem), cudamemcpyhostodevice);

printf(“p = %d \n”, temp.p[1]) ;

结果 是 p = 1;

LZ您好:

您提供的上述代码中,有诸多细节问题,如struct类型定义不正确,cudaMemcpy参数类型不正确,copy方向的枚举类型书写不正确以及方向不正确等。

在修正了上述问题之后,确实能得到您给出的结果,但是这并不代表您这样在device端使用struct是正确的做法。
因为您的上述做法仅仅是将一个指向host的数组的指针copy到device端,然后再copy回来继续在host端使用,这当然是可以的。

以及,如果您在将struct copy到device端之后改变host.p[1]的值,比如host.p[1]=100;这样,您会发现,最后temp.p[1]也是100。

以及,如果您在cudaMemcpy(dev,&host,…)之后,启动一个kernel,将dev作为参数传给kernel,在kernel里面使用dev指向的结构体中p[1]的值,那么kernel会立即挂掉。

您不妨逐一尝试。

祝您好运~

以及,您可以参考之前的有关结构体使用的讨论帖:

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6820
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6672
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6813
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7390
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7114

大致如此,祝您好运~