-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)
输出如下:
我还得到了数组的垃圾值。
问题的可能性很大
swap(&f1,&f2,sizeof(double));
Run Code Online (Sandbox Code Playgroud)
变量f1和f2的类型是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,因为它将衰减为指向其第一个元素的指针。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |