我通过以下方式对结构进行了浅复制:
struct Student{
char *name;
int age;
Courses *list; //First course (node)
Student *friends[]; //Flexible array member stores other student pointers
}Student;
void shallowCopy(const Student *one){
Student *oneCopy = malloc(sizeof(one) + 20*sizeof(Student*));
*oneCopy = *one; <--------------- ERROR POINTS TO THIS LINE
}
当我检查灵活数组成员的第一个元素时oneCopy
,为空。但是,如果我检查原始结构中灵活数组成员的第一个元素,它会成功打印出指针。原始结构的所有其他组件都被复制,例如名称和链接列表。只有灵活数组成员没有被复制。有谁知道我做错了什么?
有谁知道我做错了什么?
尝试使用赋值来复制具有灵活数组成员的结构。根据标准(6.7.2.1):
分配*s1 = *s2
只复制成员n
[IE。结构体中不是灵活数组的部分];如果任何数组元素在第一个元素内sizeof (struct s)
结构的字节,它们可能会被复制或简单地用不确定的值覆盖。
基本上,当 C 编译器看到具有灵活数组成员的结构时,它不知道它到底有多大,因此它会将其视为足够大以容纳其他成员,再加上possibly多一点:
特别是,该结构的大小就像省略了柔性阵列成员一样,只是它可能具有比省略所暗示的更多的尾部填充。
就是这样sizeof(*one)
是,并且that's当你这样做时复制的内容的大小*oneCopy = *one;
.
自从你do显然知道整个结构的大小,以便malloc
它,只需使用复制那么多字节memcpy
。或者,如果您担心这在某种程度上无法移植(老实说我不确定),请完成作业,then使用循环复制每个元素one->friends
to
oneCopy->friends
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)