C 如何复制堆对象以防止其被破坏?

C 如何复制堆对象以防止其被破坏?,c,C,我在堆上分配了一个对象。对象将从堆中销毁,但我需要保留它,最好是通过复制它并保存指向它的指针 一个例子 这里我需要复制A指向的对象,并使人指向副本 human = (struct Human *) malloc(sizeof(struct Human)); memcpy(human, A, sizeof(struct Human)); 如果有指向人类内部其他结构的指针,这将稍微复杂一些 编辑: StoryTeller在评论中建议了更优雅的解决方案: human = (struct Human

我在堆上分配了一个对象。对象将从堆中销毁,但我需要保留它,最好是通过复制它并保存指向它的指针

一个例子

这里我需要复制A指向的对象,并使人指向副本

human = (struct Human *) malloc(sizeof(struct Human));
memcpy(human, A, sizeof(struct Human));
如果有指向人类内部其他结构的指针,这将稍微复杂一些

编辑: StoryTeller在评论中建议了更优雅的解决方案:

human = (struct Human *) malloc(sizeof(struct Human));
*human = *A;

你可能想要这样的东西:

不再模糊地复制到全局变量中,尽可能避免全局变量 马洛克再也没有演员了 一旦我们完成了对人类的创造,就可以自由调用,而不是之前
你应该返回一个指针,而不是在使用完之前释放人类。为什么不简单地执行Human=a,然后跳过freeA?更好的是,返回指针,并且不要使用全局变量。对象将从堆中销毁,在您销毁它之前它不会销毁freeA。该API会获取一些文件,您需要保留指针指向的值而不是指针。或者可能只是…*human=*A;?可能是相同的净结果,但要清楚得多IMO@StoryTeller正如Hanlon在上面的评论中所指出的,这只是一个例子。事实上,自由发生在他的控制之外。注意,我并没有建议人类=A;,但是*human=*A;。你可以很好地用C语言分配结构,这不是我想要的。
human = (struct Human *) malloc(sizeof(struct Human));
*human = *A;
#include <stdio.h>
#include <stdlib.h>

struct Human
{
    int age;
    char sex;
    float height;
    float weight;
};

struct Human *create_human(int age, char sex, float height, float weight)
{
    struct Human *A = malloc(sizeof(struct Human));  // no need to cast
    A->age = age;
    A->sex = sex;
    A->height = height;
    A->weight = weight;
    return A;
}

int main()
{
    struct Human *human = create_human(22, 'M', 1.90, 100.0);
    printf("Age: %d\tSex: %c\tHeight %.2f\tWeight %.2f\n", human->age, human->sex, human->height, human->weight);
    free(human);
}
...
struct human *globalhuman;
...
int main()
{
    globalhuman = create_human(22, 'M', 1.90, 100.0);
    printf("Age: %d\tSex: %c\tHeight %.2f\tWeight %.2f\n", globalhuman ->age, globalhuman ->sex, globalhuman ->height, globalhuman ->weight);
    free(globalhuman );
}