C语言内存函数

本文详细介绍了C语言中的四个重要内存操作函数:memcpy用于非重叠复制,memmove处理重叠区域,memset用于设置内存值,memcmp用于字节级比较。通过模拟实现和使用示例,帮助理解这些函数的工作原理和注意事项。
摘要由CSDN通过智能技术生成

目录

一、memcpy的使用和模拟实现

1.memcpy的使用

2.memcpy的模拟实现 

二、memmove的使用和模拟实现

1.memmove的使用

2.memmove的模拟实现

三、memset的使用 

四、 memcmp的使用


一、memcpy的使用和模拟实现

1.memcpy的使用

 memcpy是一个用于内存复制的函数,我们知道strcpy是拷贝字符的,而memcpy不仅可以拷贝字符,还可以整型数据、浮点型数据、结构体等,因此其参数以及返回类型都是void*。

注意:

⭐num(第三个参数)单位是字节

⭐这个函数在拷贝过程中遇到'\0'并不会停下来

如果source和destination有任何的重叠,复制的结果都是未定义的(在C语言中规定,memcpy拷贝的就是不重叠的内存,memmove拷贝的是重叠的内存,但是在vs2022中memcpy也是可以实现重叠拷贝)

接下来给个使用memcpy的例子来看:

2.memcpy的模拟实现 

思路很简单,一个字节一个字节地拷贝,然后每次让num--。

代码如下:

void* my_memcpy(void* dest, void* src, size_t num)
{
    void* ret = dest; //保存起始位置
    assert(dest && src);
    while (num--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
}

二、memmove的使用和模拟实现

1.memmove的使用

memmove的作用也是拷贝,当目标区域与源区域没有重叠时,memmove的作用与memcpy一样,但是当目标区域与源区域重叠时,则必须使用memmove。

2.memmove的模拟实现

草图分析:

 为了简便,我们写代码时就直接将dest在src的情况(对应第一个和第四个)采用从前到后拷贝,另外两种就从后到前拷贝。

代码如下:

void* my_memmove(void* dest, const void* src, size_t num)
{
    void* ret = dest;
    assert(dest && src);
    if (dest < src)
    {
        //从前往后拷贝
        while (num--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后往前拷贝
        while (num--)
        {
            *((char*)dest + num) = *((char*)src + num); //dest、src依次加上num-1 num-2...
        }
    }
    return ret;
}

三、memset的使用 

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

示例如下:

四、 memcmp的使用

 

memcmp与strcmp类似,但是不仅可以比较字符,还可以比较整型、浮点型等,memcmp函数比较从ptr1和ptr2指针指向的位置开始,向后的num个字节,若完全一样则返回0,若在比较途中*ptr1>*ptr2则返回一个大于0的数,若小于则返回一个小于0的数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值