使用 memcpy() 交换数组时出现垃圾值

-2 c arrays swap memcpy garbage

我正在尝试使用 C 中的 memcpy() 创建一个通用交换函数。当我尝试交换数组时,我得到了一个垃圾值。

这是下面的代码:

#include<stdio.h>
#include<string.h>

typedef struct Student
{
    char a[10];
    int b;
    double c;
}   Student;

void swap(void* one, void* two,size_t size)

{
    char temp[size] ;
    memcpy(temp,two,size); // temp = *two;
    memcpy(two,one,size);//*two = *one;
    memcpy(one,temp,size);//*one = temp;
}

int main()
{
    int i1 = 10, i2 = 20;
    float f1 = 1.6, f2 = 8.9;
    int a1[3] = {1, 2, 3}, a2[3] = {10, 20, 30};
    Student s1 = {"Mark", 42, 5.2}, s2 = {"Bilal", 9, 3};
    swap(&i1,&i2,sizeof(int));
    printf(" i1 = %d \n i2 = %d\n",i1,i2);
    swap(&f1,&f2,sizeof(double));
    printf(" f1 = %f \n f2 = %f\n",f1,f2);
    swap(&a1,&a2,sizeof(a2));
    printf(" a1 = %d %d %d  \n a2 = %d %d %d ",a1[0],a1[1],a1[2],a2[0],a2[1],a2[2]);

}
Run Code Online (Sandbox Code Playgroud)

输出如下:

在此输入图像描述

我还得到了数组的垃圾值。

Som*_*ude 5

问题的可能性很大

swap(&f1,&f2,sizeof(double));
Run Code Online (Sandbox Code Playgroud)

变量f1f2的类型是float,而不是double。的大小float通常为四个字节,而 的大小double为八个字节。

因为您传递了错误的大小,所以您的memcpy调用将超出范围并导致未定义的行为

使用变量的大小来代替:

swap(&f1,&f2,sizeof f1);
Run Code Online (Sandbox Code Playgroud)

注意: 的值f2被打印为零应该是一个很大的暗示,问题就在那里。


另请注意,&a1and&a2是错误的。这些是指向实际数组本身的指针,而您应该将指针传递给数组的第一个元素。&a1和的类型&a2都是int (*)[3],但你应该通过int *。相反,传递 eg &a1[0],或者只是简单地传递a1,因为它将衰减为指向其第一个元素的指针。