You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:26:08