c - 如何用 char* 复制一个结构并指向它?

标签 c pointers struct duplicates

我是 C 编程新手,很想获得一些帮助。

我有这个结构:

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

我想创建一个函数,它获取指向 HOUSE 的指针,并返回一个指向位于内存中不同位置的同一 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 * ,所以意味着我还需要单独复制 char * houseName ? 我能做些什么?如何复制具有多种类型(例如 char *)的对象? 如果我有一个数组?我能做什么?

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

我怎样才能复制它?

非常感谢你!

最佳答案

您需要复制该结构以及该结构管理的所有内存。就像这样:

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

关于c - 如何用 char* 复制一个结构并指向它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816406/

相关文章:

c - 如何在C中找到数字中的最小数字及其在 vector 中的位置?

c - 如何根据给定地址初始化结构体?

c - 如何检查 C 中的地址是否有效或已分配?

c++ - 1 [main] 972 exception::handle: Exception: STATUS_ACCESS_VIOLATION 说明及修复方法

c++ - 在 C++ 中创建带有结构的节点时出现段错误

c++ - 我可以将列表放入结构中吗?

c - 包含指向其他结构的指针的结构

c - 用整数表示 float

pointers - 将 Go 指针传递给 Cgo

无法在 Gnu-Make 中禁用 "default"后缀规则