我已经很久没有使用C语言了,这让我发疯了。我有一个结构数组,我需要创建一个将一个数组复制到另一个数组的函数(我需要一个精确的副本),但我不知道如何定义函数调用。我想我需要使用指针,但是当我尝试它时会给我一个错误。
struct group{
int weight;
int x_pos;
int y_pos;
int width;
int height;
};
struct group a[4];
struct group b[4];
copySolution(&a, &b);
最后一个声明给我发错了。正如我所说,用C编程已经很久了,所以我现在有点迷失了:(
答案 0 :(得分:16)
应该这样做:
memcpy(&b, &a, sizeof(a));
编辑:顺便说一句:它会在a
中保存b
的副本。
答案 1 :(得分:3)
正如JohannesWeiß所说,memcpy()
是一个很好的解决方案。
我只想指出你可以像普通类型一样复制结构:
for (i=0; i<4; i++) {
b[i] = a[i]; /* copy the whole struct a[i] to b[i] */
}
答案 2 :(得分:0)
这有一种伪装不好的家庭作业的感觉......无论如何,考虑到原始帖子中copySolution
的预定通话格式,copySolution
的正确定义如下:
void copySolution(struct group (*a)[4], struct group (*b)[4])
{
/* whatever */
}
现在,在copySolution
内,您可以以您喜欢的任何方式复制数组。要么使用一个循环
void copySolution(struct group (*a)[4], struct group (*b)[4])
{
const struct group *pb, *pbe;
struct group *pa;
for (pa = *a, pb = *b, pbe = pb + sizeof *b / sizeof **b;
pb != pbe;
++pa, ++pb)
*pa = *pb;
}
或按上述建议使用memcpy
void copySolution(struct group (*a)[4], struct group (*b)[4])
{
memcpy(b, a, sizeof *b);
}
当然,您必须首先确定要将阵列复制到哪个方向。您没有提供任何信息,所以每个人都只是得出了一些结论。
答案 3 :(得分:0)
在我的情况下,之前的解决方案无法正常工作!例如,
@JohannesWeiß的解决方案没有复制“足够”的数据(它复制了大约一半的第一个元素)
所以万一有人需要一个解决方案,这会给你正确的结果,这里是:
int i, n = 50;
struct YourStruct *a, *b;
a = calloc(n, sizeof(*a));
b = malloc(n * sizeof(*b));
for (i = 0; i < n; ++i) {
// filling a
}
memcpy(b, a, n * sizeof(*a)); // <----- see memcpy here
if (a != NULL) free(a);
a = calloc(n*2, sizeof(*a));
memcpy(a, b, n * sizeof(*b)); // <------ see memcpy here again
有些注意事项,我使用calloc作为a,因为在'// fill a'部分,我正在进行需要初始化数据的操作。
答案 4 :(得分:-1)
在将数组作为指针传递给函数之后,编译器没有关于数组大小的信息。所以你经常需要第三个参数:要复制的数组的大小。
解决方案(没有任何错误检查)可能是:
void copySolution(struct group* a, struct group* b, size_t size) {
memcpy(a, b, size * sizeof(*a));
}
答案 5 :(得分:-3)
最简单的方法可能是
b=a
虽然使用memcpy()
的解决方案也可以使用。