【发布时间】:2015-07-31 06:27:41
【问题描述】:
我有一个名为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 record_inventory[MAX_RECORDS];
由于我正在编写的程序需要将record_inventory 的不同字段排序到Record 的新数组中,但实际上并没有更改与原始数组关联的数据,我想我需要一个简单的方法来复制一个数组到另一个。
我在网上查了一下,在stackoverflow上发现了一个帖子说要这样布局:
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);
那么我应该如何将一个结构数组复制到另一个数组并返回呢?我什至返回正确的类型(我想要的类型)?我想我只是对实际需要传递的内容感到困惑,所以现在我只是想让一些东西起作用。
【问题讨论】:
-
你能给出你从编译器得到的确切错误吗?
-
copy_record(&ret, &record_inventory)应该可以工作。请注意,您返回的是本地数组的地址,它将引用客户端代码中的无效内存。 -
@MOehm 这很有道理(第二部分)。我应该怎么做才能避免这种情况?只需将其声明为静态?
-
"memcpy(from, to, size);" ?有没有搞错? “memcpy(dest,src,大小);”是原型。
-
如果你复制
record_inventory只是为了排序,可能会浪费内存。排序后的数组可以是指向Record的指针数组:数据只在原始数组中,没有重复,并且指针根据您需要的字段进行排序。