如何使用C中的memcpy()将数组复制到数组

时间:2013-03-28 15:04:01

标签: c

我正在尝试从另一个数组(temp)复制数组a。 但我发现它并没有发生。

Fig-1

int main()
{
    typedef int arr_1[3];
    arr_1 arr[4];
    arr_1 *temp;
    arr_1 a[3] = {1, 2, 3};
    memset(&temp, 0, sizeof(temp));
    memcpy(temp, a, sizeof(temp));
}

但是当我尝试使用如下的简单程序时,

Fig-2

 main()
    {
    int abc[3], def[3];
    def[3] = {1, 2, 3};
    memcpy(abc, def, sizeof(abc));
    }

以上代码(fig-2)对我来说非常好。 但fig-1对我不起作用。两者都是相同的。 但为什么fig-1不起作用?

4 个答案:

答案 0 :(得分:8)

因为temp不是数组,所以它是一个指针,因此sizeof(temp)与数组完全无关。

您想要将memcpy更改为使用sizeof(a)。在复制之前,您还需要给temp一个合理的值,否则程序会有未定义的行为。

答案 1 :(得分:2)

例如,您必须为temp分配内容malloc()。现在它只是一个未初始化的指针。

答案 2 :(得分:2)

作为以前答案的摘要:

您应该为tmp分配大小= sizeof(a)的内存。然后memcpy,尺寸= sizeof(a)

arr_1 a[3] = {1, 2, 3};
arr_1 *temp = malloc(sizeof(a));
memcpy(temp, a, sizeof(a));

并且在您使用temp

的程序中无效时,请不要忘记免费free(temp);

答案 3 :(得分:1)

我知道,我迟到了。但是,当我阅读之前的答案时,我虽然说“您不需要所有这些变量”

使用您的简单示例:

int abc[3], def[3]; //abs is destination and def is source
def[3] = {1, 2, 3};
memcpy(abc, def, 3*sizeof(int)); //you can do sizeof(int) as you have here an array of int.

但是最好使用变量“ const int array_size = 3”或“ #define ARRAY_SIZE 3”来定义数组大小。然后,您只需将“ 3”替换为“ ARRAY_SIZE”,即可完成相同的工作并避免尺寸错误。

对于您的实际问题,您可以执行以下操作:

#define ARRAY_SIZE 3

typedef int arr_1[ARRAY_SIZE];
arr_1 arr[ARRAY_SIZE+1];//it is useless here
arr_1 *temp = (arr_1 *) malloc(sizeof(arr_1)); //it is your destination, but you have a pointer of array
arr_1 a[ARRAY_SIZE] = {1, 2, 3};//it is your source

//by doing sizeof((*temp)[0])
//you do not care about the type of you array pointer
//you are sure to take the good size --> it fills your array with 0
memset((*temp), 0, (ARRAY_SIZE+1)*sizeof((*temp)[0])); 

//same logic
//but you destination is (*temp) because you have a pointer of array
//it means that your array arr and a have the same type
memcpy((*temp), a, ARRAY_SIZE * sizeof(a[0]));  

//by the way, the las cell of arr is still 0
//and a pointer is close to an array. If you do "tmp = a;" it works.
//but it is not a copy, you just give the a's reference to tmp