当我对结构进行浅拷贝时,灵活数组成员没有被复制

布兰登

我通过以下方式对结构进行了浅表复制:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GCC与Clang复制结构灵活数组成员

没有命名成员的GCC错误结构灵活数组成员

具有灵活数组成员的结构的“数组”

具有灵活数组成员的结构的大小

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

如何均匀地分配具有灵活数组成员的结构体数组?

具有灵活数组成员的结构的数组如何表现?

什么是结构中的灵活数组成员?

未命名结构的灵活数组成员

嵌套结构中的灵活数组成员

是否允许返回具有灵活数组成员的结构?

比较指向具有灵活数组成员的结构的 2 个指针

如何初始化具有 unint_t 作为灵活数组成员的结构?

C ++“替换”为具有灵活数组成员的结构

具有灵活数组成员的结构和具有指针成员的结构之间的区别

从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

复制对象时如何复制Ruby数组成员?

使用数组并在结构中分配内存(灵活的数组成员)

与具有柔性数组成员的匿名结构联合

具有数组成员的结构

返回具有数组成员的本地结构

具有弹性char数组成员的结构

可变长度数组和灵活数组成员之间有什么区别?

在编译时初始化灵活的数组成员

为什么灵活数组成员的静态初始化有效?

联合会支持灵活的数组成员吗?

使用灵活的数组成员实现堆栈

灵活的数组成员,以访问联合原始字节

C ++中的灵活数组成员的可移植仿真?