在C中复制包含char指针的两个结构

cat*_*eof 12 c struct pointers

复制包含char数组的两个结构的标准方法是什么?

这是一些代码:

#include stdio.h>
#include string.h>
#include stdlib.h>

typedef struct {
    char* name;
    char* surname;
} person;

int main(void){
    person p1;
    person p2;

    p1.name     = (char*)malloc(5);
    p1.surname  = (char*)malloc(5);

    strcpy(p1.name, "AAAA");
    strcpy(p1.surname, "BBBB");

    memcpy(&p2, &p1, sizeof(person));
    free(p1.name);
    printf("%s\n", p2.name);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该行printf("%s\n", p2.name);不打印,因为我释放了缓冲区.

我的结构的问题是它们比struct更大person.它们包含数百个char指针,我必须逐个复制每个成员.

是否有另一种方法来复制包含char数组的两个结构而不使用mallocstrcpy为每个成员?

Ale*_* C. 13

你别无选择,只能自己提供复制功能:

void copy_person(person *dst, const person *src)
{
    dst->name = malloc(strlen(src->name) + 1);
    dst->surname = malloc(strlen(src->surname) + 1);
    strcpy(dst->name, src->name);
    strcpy(dst->surname, src->surname);
}
Run Code Online (Sandbox Code Playgroud)

这可能比那更详细:检查错误,考虑strlen + strcpy辅助函数等.

这就是C++中的复制构造函数.

  • 如果你在POSIX系统(例如linux)上,你可以使用`strdup`而不是`malloc + strcpy`. (4认同)

sch*_*hot 7

是的,复制包含char 数组的 struct 将没有任何问题,但是带有char 指针的结构(或任何类型的指针)你必须手动完成.

另请注意,C语言中不需要使用malloc的返回类型转换(它在C++中),并且可以隐藏malloc缺少的原型.