1

我以以下方式制作了一个浅拷贝结构:

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
}

当我检查灵活数组成员 it 的第一个元素时oneCopy,它为空。但是,如果我检查原始结构中灵活数组成员的第一个元素,它会成功打印出指针。原始结构的所有其他组件都像名称和链表一样被复制。只有灵活的数组成员不会被复制。有谁知道我做错了什么?

4

2 回答 2

3

有谁知道我做错了什么?

尝试使用赋值来复制具有灵活数组成员的结构。从标准(6.7.2.1):

赋值*s1 = *s2只复制成员n[即结构中不是灵活数组的部分];如果任何数组元素在sizeof (struct s)结构的第一个字节内,它们可能会被复制或简单地用不确定的值覆盖。

基本上,当 C 编译器看到一个具有灵活数组成员的结构时,它不知道它到底有多大,所以它认为它足够大以容纳其他成员,可能还有更多:

特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。

就是这样sizeof(*one)就是你复制时复制的大小*oneCopy = *one;

由于您显然知道整个结构的大小,malloc因此只需使用memcpy. 或者,如果您担心这在某种程度上是不可移植的(老实说我不确定),请执行分配,然后使用循环将每个元素从 复制one->friends
oneCopy->friends.

于 2016-02-16T04:05:44.367 回答
0

在您的代码片段中,结构声明是错误的。我认为您的意思是结构的 typedef,而不是声明结构的对象。

例如

typedef struct Student
^^^^^^^
{
    char *name;
    int age;
    Courses *list;  //First course (node)
    struct Student *friends[];   //Flexible array memeber stores other student pointers
    ^^^^^^^^^^^^^^
} Student;

malloc的这个调用也是错误的

Student *oneCopy = malloc(sizeof(one) + 20*sizeof(Student*));

应该有

Student *oneCopy = malloc(sizeof( *one ) + 20*sizeof(Student*));
                                  ^^^^^

这是一个演示程序,显示了如何编写函数

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

typedef struct Student
{
    char *name;
    int age;
//    Courses *list;  //First course (node)
    struct Student *friends[];   //Flexible array memeber stores other student pointers
} Student;

Student * shallowCopy( const Student *one, size_t friends )
{
    Student *oneCopy = malloc( sizeof( Student ) + friends * sizeof( Student * ) );

    *oneCopy = *one;

    memcpy( oneCopy->friends, one->friends, friends * sizeof( Student * ) );

    return oneCopy;
}

int main( void )
{
    Student *one = malloc( sizeof( Student ) + sizeof( Student * ) );

    one->friends[0] = malloc( sizeof( Student ) );

    one->friends[0]->age = 20;

    Student *oneCopy = shallowCopy( one, 1 );

    printf( "Age = %d\n", oneCopy->friends[0]->age );

    free( one->friends[0] );
    free( one );
    free( oneCopy );
}    

它的输出是

Age = 20

考虑到结构还包含一个数据成员,该数据成员将存储灵活数组中的元素数量。:)

于 2016-02-16T04:16:46.690 回答