在函数内部构造本地副本

时间:2019-05-01 15:19:53

标签: c struct copy

我有一个名为“ point”的结构和一个名为“ A [N]”的“ points”数组。 我也有一个函数,我想要一个本地副本“ A”。 如何在函数内部获取本地“ A”副本?

struct point A[N];
int function(struct point *A)
{
   struct point *ALocal;

   ...

}

3 个答案:

答案 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作为参数传递,则传递整个结构的副本。返回结构(或并集)也是如此。