使用memcpy()交换数组时出现垃圾值的问题
解决通用swap函数交换数组出现垃圾值的问题
问题根源
你的代码存在两个关键问题导致数组交换后出现垃圾值:
- float交换时的内存越界:交换
f1和f2时,你传入了sizeof(double)作为size参数,但f1和f2是float类型(通常占4字节),sizeof(double)是8字节。这会导致memcpy读取和写入超出float变量范围的内存,破坏了后续数组a1/a2的内容,进而导致数组交换后出现垃圾值。 - 数组参数传递不规范:交换数组时你传递了
&a1和&a2(指向整个数组的指针),虽然地址值和数组首地址一致,但更合理的做法是直接传递数组名a1和a2(会退化为指向首元素的指针),代码更清晰。
修正后的代码
#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); memcpy(two, one, size); memcpy(one, temp, size); } 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.0}; swap(&i1, &i2, sizeof(int)); printf("i1 = %d \ni2 = %d\n", i1, i2); // 修正:使用sizeof(float)而非sizeof(double) swap(&f1, &f2, sizeof(float)); printf("f1 = %f \nf2 = %f\n", f1, f2); // 修正:传递数组名(首元素指针)而非数组的地址 swap(a1, a2, sizeof(a2)); printf("a1 = %d %d %d \na2 = %d %d %d ", a1[0], a1[1], a1[2], a2[0], a2[1], a2[2]); }
额外说明
- 你的
swap函数本身逻辑是正确的,变长数组char temp[size]在C99及以后标准中是合法的。如果需要兼容更早的C标准,可以改用动态内存分配(malloc(size)),记得用完后free。 - 结构体交换的逻辑同样适用,只需添加对应的printf输出即可验证。
内容的提问来源于stack exchange,提问作者Shafeeq Ahamed
相关产品推荐
相关产品推荐

