我有一个名为“ point”的结构和一个名为“ A [N]”的“ points”数组。 我也有一个函数,我想要一个本地副本“ A”。 如何在函数内部获取本地“ A”副本?
struct point A[N];
int function(struct point *A)
{
struct point *ALocal;
...
}
答案 0 :(得分:2)
您的函数签名不适用于通过其参数接收其地址的数组的本地副本。为此,函数需要知道数组包含多少个元素,并且函数参数不能传达该信息。那么,也许您想要一个这样的签名:
int function(struct point *A, size_t N) {
// ...
在这种情况下,最可靠的方法是动态分配本地副本:
struct point *localA = malloc(N * sizeof(*localA));
if (!localA) {
// fail, maybe with:
return -1;
}
已经成功分配了空间,您可以通过memcpy()
函数对数组进行浅表复制:
memcpy(localA, A, N * sizeof(*localA));
然后您可以在本地副本上执行所需的任何操作,但是请注意,它是 shallow 副本。也就是说,如果struct point
包含任何指针,那么将被复制的是指针本身,而不是指针所指向的数据。
// do something ...
最终,您必须确保在每个代码路径上,在函数返回之前已释放分配的空间,或者以某种方式移交了释放空间的责任。
free(localA);
return 0;
}
答案 1 :(得分:0)
在C语言中没有一种单步克隆数组的方法,因此您不得不创建一个新数组并复制内容:
struct point A[N];
int function(struct point *A)
{
int i = 0;
struct point ALocal[N];
memcpy(ALocal, A, sizeof(ALocal));
}
实际上,我想那是一步。
请注意,您又如何知道N
是什么。考虑将其作为参数传递到function
中,以便确保它适用于该数组。
也要小心使用sizeof(ALocal)
,而不要使用sizeof(A)
,因为在函数内部,名称A
只是指向指针,而不是数组本身,因此生成的{{1} }可能不是您所期望的。
答案 2 :(得分:0)
struct point_A_N
{
struct point A[N];
};
int function(struct point_A_N an)
{
struct point_A_N z = an;
}
结构按值传递,并按值分配。因此,当您分配该结构时,会将其复制到另一个结构。如果将struct作为参数传递,则传递整个结构的副本。返回结构(或并集)也是如此。