Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C中的函数复制结构数组_C_Arrays_Struct_Memcpy - Fatal编程技术网

使用C中的函数复制结构数组

使用C中的函数复制结构数组,c,arrays,struct,memcpy,C,Arrays,Struct,Memcpy,我有一个名为Record的结构,其中包含与之相关联的数据,在我的程序中,我有一个Records数组。结构如下所示: #define MAX_RECORDS 1024 typedef struct { char title[80]; char artist[80]; int year; char genre[80]; char label[80]; double price; } Record; Record r

我有一个名为
Record
的结构,其中包含与之相关联的数据,在我的程序中,我有一个
Record
s数组。结构如下所示:

#define MAX_RECORDS 1024

typedef struct
{
    char    title[80];
    char    artist[80];
    int     year;
    char    genre[80];
    char    label[80];
    double  price;
} Record;

Record record_inventory[MAX_RECORDS];
void copy_record(Record (*copy_to)[MAX_RECORDS], Record (*copy_from)[MAX_RECORDS])
{
    memcpy(copy_from, copy_to, sizeof *copy_from);
}
Record* sort_by_title()
{
    Record ret[MAX_RECORDS];
    copy_record(&ret, record_inventory); // compilation error saying incorrect pointer type
    // do sorting here
    return ret;
}
由于我正在编写的程序需要将
record\u inventory
的不同字段排序到一个新的
record
数组中,但实际上并没有更改与原始数组关联的数据,因此我想我需要一种简单的方法将一个数组复制到另一个数组

我在网上看到一篇关于stackoverflow的帖子,上面写道:

#define MAX_RECORDS 1024

typedef struct
{
    char    title[80];
    char    artist[80];
    int     year;
    char    genre[80];
    char    label[80];
    double  price;
} Record;

Record record_inventory[MAX_RECORDS];
void copy_record(Record (*copy_to)[MAX_RECORDS], Record (*copy_from)[MAX_RECORDS])
{
    memcpy(copy_from, copy_to, sizeof *copy_from);
}
Record* sort_by_title()
{
    Record ret[MAX_RECORDS];
    copy_record(&ret, record_inventory); // compilation error saying incorrect pointer type
    // do sorting here
    return ret;
}
现在,在排序方法中,我有一个函数原型,如下所示:

#define MAX_RECORDS 1024

typedef struct
{
    char    title[80];
    char    artist[80];
    int     year;
    char    genre[80];
    char    label[80];
    double  price;
} Record;

Record record_inventory[MAX_RECORDS];
void copy_record(Record (*copy_to)[MAX_RECORDS], Record (*copy_from)[MAX_RECORDS])
{
    memcpy(copy_from, copy_to, sizeof *copy_from);
}
Record* sort_by_title()
{
    Record ret[MAX_RECORDS];
    copy_record(&ret, record_inventory); // compilation error saying incorrect pointer type
    // do sorting here
    return ret;
}
上面的注释给了我一个不正确的指针类型错误。但是,执行以下所有操作也不会奏效:

copy_record(&ret, &record_inventory);
copy_record(&ret, *record_inventory);
copy_record(ret, record_inventory);
copy_record(ret, &record_inventory);
copy_record(*ret, *record_inventory);

那么,我应该如何将一个结构数组复制到另一个数组并返回它呢?我是否返回了正确的类型(我想要的类型)?我想我只是对我需要传递的内容感到困惑,所以现在我只是想让它工作。

您的函数声明声明,出于某种原因,它需要指向指针的指针。应该是:

void copy_record(Record *copy_to, Record *copy_from)
{
    memcpy(copy_to, copy_from, sizeof(*copy_from) * MAX_RECORDS);
}
memcpy(copy_to, copy_from, sizeof *copy_from);

然后将其称为
copy\u record(ret,record\u inventory)

由于某种原因,函数声明声明将指针指向指针。应该是:

void copy_record(Record *copy_to, Record *copy_from)
{
    memcpy(copy_to, copy_from, sizeof(*copy_from) * MAX_RECORDS);
}
memcpy(copy_to, copy_from, sizeof *copy_from);

然后将其称为
copy\u record(ret,record\u inventory)

如下所示修改代码

void copy_record(Record (*copy_to), Record (*copy_from))
{
    memcpy(copy_from, copy_to, sizeof(*copy_from) * MAX_RECORDS);
}

Record* sort_by_title()
{
    Record ret[MAX_RECORDS];
    copy_record(ret, record_inventory); 
    return ret;
}

如下所示修改代码

void copy_record(Record (*copy_to), Record (*copy_from))
{
    memcpy(copy_from, copy_to, sizeof(*copy_from) * MAX_RECORDS);
}

Record* sort_by_title()
{
    Record ret[MAX_RECORDS];
    copy_record(ret, record_inventory); 
    return ret;
}

事实上,仅仅将数组本身作为参数来排序是不可能的。因为在c中,如果你写一个函数

void func(int arr[100]);
参数
arr
实际上是指针而不是数组。也就是说,以下几行没有什么不同

void func(int *arr);
void func(int arr[]);
void func(int arr[100]);
因此,当您尝试
sizeof
arr
时,只需获得指向
int
的指针的大小。您得到的是
sizeof(int*)

如果函数希望接收数组,则必须将数组的长度作为参数给出:

void func(int arr[], size_t length);
复制
记录
数组的功能应为

void copy_array(Record dest[], Record from[], size_t length)
{
    memcpy(dest, from, sizeof(Record) * length);
}
您的代码无法编译,因为您弄乱了指针和指向数组的指针的概念
在代码中,
Record(*copy\u to)[MAX\u RECORDS]
copy\u to
是指向
记录的数组的指针。并且定点数组的长度是固定的(MAX_记录)

更重要的是,大型对象的就地排序相当缓慢。您应该考虑创建一组指针(或索引)并对指针进行排序。
非常抱歉英文不好。

事实上,仅仅将数组本身作为参数来排序是不可能的。因为在c中,如果你写一个函数

void func(int arr[100]);
参数
arr
实际上是指针而不是数组。也就是说,以下几行没有什么不同

void func(int *arr);
void func(int arr[]);
void func(int arr[100]);
因此,当您尝试
sizeof
arr
时,只需获得指向
int
的指针的大小。您得到的是
sizeof(int*)

如果函数希望接收数组,则必须将数组的长度作为参数给出:

void func(int arr[], size_t length);
复制
记录
数组的功能应为

void copy_array(Record dest[], Record from[], size_t length)
{
    memcpy(dest, from, sizeof(Record) * length);
}
您的代码无法编译,因为您弄乱了指针和指向数组的指针的概念
在代码中,
Record(*copy\u to)[MAX\u RECORDS]
copy\u to
是指向
记录的数组的指针。并且定点数组的长度是固定的(MAX_记录)

更重要的是,大型对象的就地排序相当缓慢。您应该考虑创建一组指针(或索引)并对指针进行排序。
非常抱歉英语不好。

声明变量时,请小心,因为括号可能有特殊含义
Record*x
是指向
Record
的指针,但
Record(*x)(
是指向返回
记录作为结果的函数的指针。你给了编译器一段艰难的时间,试图找出你想要从中得到什么

另外,
Record*x
相当于
Record x[]
Record*x[]
(正如您所做的)相当于
Record**x
(指向指针的指针),这与
Record*x
不同,因此编译器无法识别类型


此外,
memcpy()
首先获取目标地址,因此您的参数是反向的,并且您还从数组中复制一个元素,而不是整个数组,正如。

声明变量时,请小心,因为括号可能有特殊意义
Record*x
是指向
Record
的指针,但
Record(*x)(
是指向返回
记录作为结果的函数的指针。你给了编译器一段艰难的时间,试图找出你想要从中得到什么

另外,
Record*x
相当于
Record x[]
Record*x[]
(正如您所做的)相当于
Record**x
(指向指针的指针),这与
Record*x
不同,因此编译器无法识别类型


此外,
memcpy()
首先获取目标地址,因此您的参数被反转,并且您还从数组中复制单个元素而不是整个数组,正如。

您的复制函数具有正确的签名,您可以通过以下方式调用它:

copy_record(&ret, &record_inventory);
然而,你把
memcpy
的参数弄错了方向;目的地在前。应该是:

void copy_record(Record *copy_to, Record *copy_from)
{
    memcpy(copy_to, copy_from, sizeof(*copy_from) * MAX_RECORDS);
}
memcpy(copy_to, copy_from, sizeof *copy_from);

但是您的
sort\u by\u title()
函数存在设计缺陷
ret
是该函数的本地数组。当函数返回时,它将被销毁。如果您成功地返回了指向它的指针,那么指针将悬空

相反,您可以让
按标题排序
获取输入和输出参数,