如何复制使用char *和点上有一个结构?(How to duplicate a struct wi

2019-07-30 19:41发布

我在C编程新很想得到一些帮助。

我有这样的结构:

typedef struct house
{
   int numOfRooms;
   char* houseName;
}HOUSE,*pHOUSE;

我想创建得到一个指针HOUSE,并返回一个新的指针,以相同的房子坐落在一个不同的地方在内存中的功能 - 目的就是为了能够改变一个指针不改变都:我会尽量更清晰:

pHOUSE duplicate_house(pHOUSE house)
{
  pHOUSE newh = (pHOUSE)calloc(1,sizeof(HOUSE));
  newh = house 
 //I get here a pointer that points on the same house.. so If I change for exmample:
 //  newh->numOfRooms = 9 - > both will change and I don't want it to happen!


}

我看,我们可以使用:memcpy_s但在这里,如果我只用了结构内的整数它可能是容易的,在这里我有字符*,就意味着我也需要复制的char * houseName分开? 我能做什么? 我怎样才能复制具有繁殖类型,如对象char * ? 而如果我有一个数组? 我能做什么 ?

typedef struct house
{
    int numOfRooms;
     char* houseName;
     struct house *houses[10];
}HOUSE,*pHOUSE;

我怎么可以复制?

非常感谢!

Answer 1:

您需要同时复制结构以及多数民众赞成结构来管理所有的内存。 像这样:

pHOUSE copy(pHOUSE house)
{
    pHOUSE newHouse = malloc(sizeof *newHouse);      // allocate

    if (pHOUSE)
    {
        memcpy(newHouse, house, sizeof *newHouse);   // or "*newHouse = *house;"
        size_t const len = strlen(house->houseName);
        newHouse->houseName = malloc(len + 1);

        if (!newHouse->houseName) { free newHouse; return NULL; }

        strncpy(newHouse->houseName, house->houseName, len + 1);
    }
    return pHOUSE;
}

正如你所看到的,错误有两个分配处理已经变得非常麻烦。 如果你有多个内部分配,保持理智的唯一方法是使用goto小号系统建立适当的清理点。


例子来说明的最后一点:

struct FooLish
{
    char * p1;
    char * p2;
    char * p3;
};

struct FooLish * copy(struct FooLish const * oldFoo)
{
    struct FooLish * newFoo = malloc(sizeof *newFoo);
    if (!newFoo) { goto end0; }

    {
        size_t const len = strlen(oldFoo->p1);
        newFoo->p1 = malloc(strlen(len + 1);
        if (!newFoo->p1) { goto end1; }
        strncpy(newFoo->p1, oldFoo->p1, len + 1);
    }
    {
        size_t const len = strlen(oldFoo->p2);
        newFoo->p2 = malloc(strlen(len + 1);
        if (!newFoo->p2) { goto end2; }
        strncpy(newFoo->p2, oldFoo->p2, len + 1);
    }
    {
        size_t const len = strlen(oldFoo->p3);
        newFoo->p3 = malloc(strlen(len + 1);
        if (!newFoo->p3) { goto end3; }
        strncpy(newFoo->p3, oldFoo->p3, len + 1);
    }

    return newFoo;

end3:
   free(newFoo->p2);
end2:
   free(newFoo->p1);
end1:
   free(newFoo);
end0:
    return NULL;
}


文章来源: How to duplicate a struct with char* and point on it?