memcpy函数 & 使用泛型指针交换任何类型数据

本文介绍了memcpy函数的源码,并探讨了如何使用泛型指针交换不同类型的数据。在main函数中,通过swapData函数进行数据交换时,强调了参数src和dst内存区域不能重叠以及size参数的重要性。当size参数设置错误时,可能导致意外的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcpy函数源码

void *memcpy(void *dest,void *src, unsigned int count)
{
    if (dest == src)
        return src;

    char* d = (char*)dest;
    char* s = (char*)src;

    while(count-- > 0)
        *d++ = *s++;

    return dest;
}

使用泛型指针交换任何类型数据

 int swapData(void *x, void *y, int size) {
    void *tmp;

    if ((tmp = malloc(size)) == NULL) {
        return -1;
    }

    //memcpy(void *__dst, const void *__src, size_t __n)
    //memcpy功能:由src所指内存区域复制n个字节到dst所指内存区域
    //⚠️src和dst所指内存区域不能重叠,函数返回指向dst的指针
    /*
    //以下示例返回数据a='\0', b='a',因为在操作memcpy(x, y, size)时,由于两个数据均为1个字节并且在内存中一般是
    //连续的,但是分配了2个字节,导致src和dst内存区域重叠了,如果在a和b之间加一个数据string str = "abcde",
    //输出就正常了,因为给a、b各分配2个字节就不会重叠了;正常情况应该使用swapData(&a, &b, 1);
    //size应该为待交换数据的大小,而不能随意指定
    char a = 'a';
    char b = 'b';
    swapData(&a, &b, 2);
    */

    memcpy(tmp, x, size);
    memcpy(x, y, size);
    memcpy(y, tmp, size);
    free(tmp);

    return 0;
}

main函数部分

int main(int argc, const char * argv[]) {

    char a = 'a';
    //string str("abcde");
    char b = 'b';
    cout << a << "   " << b << endl;

    //输出结果:a   b  \r\n  b   a
    //swapData(&a, &b, 1);
    //输出结果:a   b  \r\n  \0(或者其它未知数据)   a
    swapData(&a, &b, 2);
    cout << a << "   " << b << endl;

    return 0;
}

swapData(&a, &b, 2)的输出结果异常分析:
关键在于函数memcpy中的参数src和dst所指内存区域不能重叠
当传入的size和数据大小不一致时,会发生意想不到的情况

以下是对swapData(&a, &b, 2)输出结果的分析:

分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值