C 将一个值从一个结构集中营复制到另一个结构但数据类型相同

C 将一个值从一个结构集中营复制到另一个结构但数据类型相同,c,struct,C,Struct,所以我有一个结构,我用该结构数据类型初始化了一个变量a,然后输入了一些值。但是现在我需要将这些值放入另一个具有相同结构数据类型的变量B。我怎样才能做到这一点 struct s_Especialidade{ int id; char nome[60]; char descricao[60]; struct s_Especialidade *proximo; }; typedef struct s_Especialidade Especialidade; P

所以我有一个结构,我用该结构数据类型初始化了一个变量
a
,然后输入了一些值。但是现在我需要将这些值放入另一个具有相同结构数据类型的变量
B
。我怎样才能做到这一点

struct s_Especialidade{
    int id;
    char nome[60];  
    char descricao[60];
    struct s_Especialidade *proximo;
}; 
typedef struct s_Especialidade  Especialidade;

PESPECIALIDADE p, *array;
p->nome = &array[i]->nome; //THIS LINE GIVES THE ERROR

因为它是一个字符数组,所以需要复制数组中的每个元素

strcpy(p->nome,array[i]->nome)
可以做到这一点,但为了获得额外的安全性,请查看
strncpy
,您可以在其中设置最大长度以避免溢出。

尝试以下方法:

memcpy( p->nome, array[i].nome, 60 * sizeof(char) );
或者泛化类型,选择
p->nome
数组中使用的类型:

memcpy( p->nome, array[i].nome, 60 * sizeof(*(p->nome)) );

这是将一个数组复制到另一个数组(不仅仅是字符串)的通用且安全的方法。

要扩展答案,我建议使用
strcpy()
,并使用定义的长度确保始终使用相同的值

#define NOME_LENGTH 60    

struct s_Especialidade{
    int id;
    char nome[NOME_LENGTH];  
    char descricao[60];     
    struct s_Especialidade *proximo;
}; 
typedef struct s_Especialidade  Especialidade;

PESPECIALIDADE p, *array; 

memcpy(p->nome, array[i]->nome, NOME_LENGTH);
在考虑分配任务时,事情变得更加复杂,但是,在一个示例程序中:

struct stuff {
    char buf[2];
};

int main() {
    struct stuff a;
    memcpy(a.buf, "aa", 2); // *Edit: "aa" is a bad example as it 
                            // actually becomes at compilation 3 bytes long 
                            // {'a','a','\0'} as noted in the comments

    struct stuff b;
    b.buf = a.buf; // *Edit: For illustrative purposes, an assignment 
                   // between two char[2] members is not correct and
                   // does not compile.
}
编译将删除错误
error:为
b.buf=a.buf
行从类型“char*”
分配给类型“char[2]”时出现的不兼容类型

指针和数组的主题已经在其他地方讨论过了


*编辑:如注释中所述,在上述代码中,如果不是
b.buf=a.buf结构赋值nt
b=a完成后,将正确复制内部成员。这是因为结构到结构的赋值实际上是
memcpy(&b,&a,sizeof(b))
()

使用
strcpy
strncpy
charbuf[3]“aa”
'\0'
结尾!您有3个字符要复制。@Golgauth“aa”以
'\0'
结尾与此无关,因为只有2个字符要从中复制,而目标只有2个字符长。buf不会被NUL终止,但那是另一回事。“编译会导致错误”--
a=b而不是。。。这很好。@JimBalter是的,我知道那只是为了教学目的。以防有人读到这页并试图从中操纵C字符串。我现在不忙,所以…;-)
sizeof(char)
始终为1,因此乘以它将一无所获。如果你想说的是一般性的,那就用
60*sizeof*p->nome
你说得很对,但我还是想让初学者清楚一点。编辑。谢谢