使用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
是该函数的本地数组。当函数返回时,它将被销毁。如果您成功地返回了指向它的指针,那么指针将悬空
相反,您可以让按标题排序
获取输入和输出参数,