将一个结构分配给C中结构内部的另一个结构

将一个结构分配给C中结构内部的另一个结构,c,pointers,struct,C,Pointers,Struct,我想将一个结构分配到结构中的一个字段中,使其成为指向结构的指针。 我会在这里告诉你我在说什么: typedef struct { char *name; } geometry; typedef struct sceneGR_tag { geometry *g; struct sceneGR_tag *next; } sceneGR; typedef struct { geometry *g; int nshapes; sceneGR *r

我想将一个结构分配到结构中的一个字段中,使其成为指向结构的指针。 我会在这里告诉你我在说什么:

typedef struct {

    char *name;

} geometry;

typedef struct sceneGR_tag {
    geometry *g;
    struct sceneGR_tag *next;
} sceneGR;

typedef struct {
    geometry *g;
    int nshapes;

    sceneGR *root;  
} scene;
如您所见,
sceneGR
有一个几何体*g(因此是一个几何体数组)。 假设我已经用几何体初始化了结构“场景”,我想将其几何体复制到结构“场景”中,然后在场景->g中复制

如何在我的
for
中执行此操作:

scene *scn; //already initialized with nshapes=6, and so with 6 geometries until g[5];

for(k = 0; k < scn->nshapes; k++) {
    //what can i do here?
}
场景*scn//已经使用nshapes=6初始化,因此使用6个几何体初始化,直到g[5];
对于(k=0;knshapes;k++){
//我能在这里做什么?
}

为什么需要循环?你只需要做:

scn->root->geometry = scn->geometry;
但如果我知道这不是你想要的,请告诉我

编辑

您希望复制每个
scen->g
scn->g
的每个几何体值。但这很奇怪,除非在
结构场景中有
几何体**g
。但是,您可以使用代码执行此操作:

scene *scn;
sceneGR *s_list = scn->root;

for(k = 0; k < scn->nshapes; k++) {
    s_list->g = &(scn->g[k]);
    s_list = s_list->next;
}

如果定义了
几何体
,以便按位复制有意义,则:

SceneGR *gr = malloc(sizeof *gr);
size_t num_bytes_to_copy = scn->nshapes * sizeof scn->g[0];

gr->next = NULL;
gr->g = malloc( num_bytes_to_copy );
memcpy(gr->g, scn->g, num_bytes_to_copy );
如果没有,则必须循环调用每个
几何体
对象的复制函数

另外,尚不清楚
SceneGR
应该如何知道其数组中有多少项


销毁
SceneGR
场景时,不要忘记释放(gr->g)

场景*scn是唯一的声明。不是初始化。你想要一个副本还是应该指向同一个对象?@Jayesh我不能向你展示整个程序,相信我,在循环之前我已经初始化了。我没有写它,因为有数百行代码。@mch我想要一个副本,这样每个scn->g[k]都会被复制到每个新的sceneGR对象中;例如:sceneGR*gr0=scn->g[0],sceneGR*gr1=scn->g[1]等等@Aerox什么?但您希望将
几何体
属性化为
场景
。这没有道理。不清楚你想要什么。是的,对不起,这不是我真正想做的。类似于:将scn->g[k]复制到其scenGR->g中新定义的sceneGR中,因为每个场景->g[k]都是不同的。因此,我想在每个不同的场景中单独复制它。现在,它与您发布的第一个方法一起工作。非常感谢你。我不明白错误到底在哪里。我所知道的唯一一件事是,它是有效的:-)
SceneGR *gr = malloc(sizeof *gr);
size_t num_bytes_to_copy = scn->nshapes * sizeof scn->g[0];

gr->next = NULL;
gr->g = malloc( num_bytes_to_copy );
memcpy(gr->g, scn->g, num_bytes_to_copy );