如何使用char *复制结构并指向它?

我是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 *等多种类型的对象? 如果我有arrays? 我能做什么 ?

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

如您所见,使用两个分配的error handling已变得非常麻烦。 如果你有多个内部分配,保持理智的唯一方法是系统地使用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; }