C++ 将结构复制到C++;

C++ 将结构复制到C++;,c++,arrays,struct,C++,Arrays,Struct,我有一个以下类型的结构 typedef struct Edge { int first; int second; }Edge; 我在我的主函数中实例化并复制到一个数组中 Edge h_edges[NUM_EDGES]; for (int i = 0; i < NUM_VERTICES; ++i) { Edge* e = (Edge*)malloc(sizeof(Edge)); e->first = (rand() % (NU

我有一个以下类型的结构

typedef struct Edge
{
    int first;
    int second;

}Edge;
我在我的主函数中实例化并复制到一个数组中

Edge h_edges[NUM_EDGES];
for (int i = 0; i < NUM_VERTICES; ++i)
    {
        Edge* e = (Edge*)malloc(sizeof(Edge));
        e->first = (rand() % (NUM_VERTICES+1));
        e->second = (rand() % (NUM_VERTICES+1));
        memcpy(h_edges[i], e, sizeof(e));
    }

第28行是memcpy发生的那一行。感谢您的帮助。

memcpy的
的第一个参数接受指针,第三个参数需要指向
结构的大小,而不是指针

memcpy(&h_边[i],e,sizeof(*e))

这是解决办法

但这是不明智的。严格来说,程序的行为是未定义的。不能以定义的方式使用
memcpy
复制结构。本质上,原因在于结构包装

最好是显式复制结构成员。您可以构建一个函数来实现这一点

另一点是,使用
%
将在随机数中引入统计偏差,除非模数是生成器周期的倍数;这是不可能的


(一个小点,写
Edge*e=malloc(sizeof(Edge));
代替。也就是说,把石膏放在右手边。这在C中是不必要的。)

你根本不需要使用
malloc
memcpy
。你可以:

Edge h_edges[NUM_EDGES];
for (int i = 0; i < NUM_VERTICES; ++i)   // or should this be NUM_EDGES??
{
    h_edges[i].first = (rand() % (NUM_VERTICES+1));
    h_edges[i].second = (rand() % (NUM_VERTICES+1));
}
边h_边[NUM_边];
对于(int i=0;i
memcpy
中的
h\u edges[i]
类型为
Edge
的项应为
void*
。不能使用结构类型代替指针类型。您需要
memcpy(&h_边[i],e,sizeof(*e))
。换句话说,
h_edges[i]
的地址就是您要复制到的地址,您希望
e
指向的地址的大小不是
e
本身的大小,它是一个指针(您可以得到指针的大小)。你也可以在那里使用
sizeof(Edge)
。还有。。。不要强制执行malloc的返回。只需使用,
Edge*e=malloc(sizeof(Edge))。如果我不强制转换该值,这就是我得到的src/main.cu(25):错误:类型为“void*”的值不能用于初始化类型为“Edge*”的实体。不强制转换
malloc
不应生成错误。如果是的话,那就是出了问题<代码>边缘*e=malloc(sizeof(边缘))应该可以正常工作。请注意,因为您使用CUDA编译器驱动程序在.Cu文件中编译此代码,实际上,您的代码是由C++编译器编译的,C++而不是C语义适用于使用<代码> MalOC 。当然,您在该代码段中使用
malloc
的原因一点也不明显。需要是
sizeof(*e)
,因为
e
是指向所复制内容的指针(一个
Edge
结构)。或者,
sizeof(Edge)
。我不认为完整结构的
memcpy
是未定义的行为。C应该一致地定义
struct
的内部结构。在
malloc
上强制转换的类型不仅是不必要的,。我不确定您在这一点上是否正确,但我会检查一下。如果您用C编写一个返回结构的函数,
gcc
编译器将在内部生成对
memcpy
的调用,以复制返回值的结构。所以我认为这很好。:)是的,这确实好得多。但是如果你需要良好的一致性,一定要修正随机数选择。是的,这是更好的方法。
Edge h_edges[NUM_EDGES];
for (int i = 0; i < NUM_VERTICES; ++i)   // or should this be NUM_EDGES??
{
    h_edges[i].first = (rand() % (NUM_VERTICES+1));
    h_edges[i].second = (rand() % (NUM_VERTICES+1));
}