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));
}