我通过以下方式对结构进行了浅表复制:
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
,它为null。但是,如果我在原始结构中检查了弹性数组成员的第一个元素,它将成功打印出指针。将复制原始结构的所有其他组件,例如名称和链接列表。只是不会复制灵活数组成员。有人知道我在做什么错吗?
有人知道我在做什么错吗?
尝试使用赋值来复制具有灵活数组成员的结构。从标准(6.7.2.1):
分配
*s1 = *s2
仅复制成员n
(即结构的非灵活数组的一部分);如果任何数组元素在sizeof (struct s)
结构的第一个字节之内,则可能会复制它们或用不确定的值简单地覆盖它们。
基本上,当C编译器看到具有灵活数组成员的结构时,它不知道其实际大小,因此将其视为足以容纳其他成员的结构,并且可能还会容纳更多其他成员:
特别地,该结构的尺寸就好像省略了柔性阵列构件,除了其可能具有比省略所暗示的更多的尾随填充。
这就是sizeof(*one)
是,和这的时候你做什么被复制的大小*oneCopy = *one;
。
既然你做显然知道整个结构的大小,为了malloc
它,只需复制多少字节使用memcpy
。或者,如果您担心这种方式难以携带(坦率地说,我不确定),请执行赋值操作,然后使用循环将每个元素从复制one->friends
到
oneCopy->friends
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句