C语言----常见内存操作函数1

文章详细介绍了C语言中的四个关键内存操作函数:memcpy用于无重叠内存区域的复制,memmove处理可能重叠的内存移动,memcmp用于比较内存区域,memset用于设置内存区域的值。每个函数都提供了使用示例和简单的模拟实现,以帮助理解其工作原理和应用场景。
摘要由CSDN通过智能技术生成

目录

一、memcpy

1.关于memcpy

2.memcpy的使用

 3.模拟实现memcpy

二、memmove

1.关于memmove

2.memmove的使用

3.模拟实现memmove

三、memcmp

1.关于memcmp

2.memcmp的使用

3.模拟实现memcmp

四、memset

1.关于memset

2.memset的使用

3.模拟实现memset


一、memcpy

1.关于memcpy

        使用MSDN查看memcpy可得:

         memcpy需要3个参数:dest为复制的目的内存地址,src为源数据的内存地址,count为需要复制的字节数。

2.memcpy的使用

        以一个字符串拷贝到另一个字符串为例:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "hello world";
    char arr2[20] ={ 0 };
    memcpy(arr2, arr1, strlen(arr1)+1);
    puts(arr2);
    return 0;
}

        使用VS执行可得:

         为了整个复制arr1,使用了strlen对arr1的长度进行查看并加上字符串结束标志'\0'

 3.模拟实现memcpy

        创建my_memcpy函数用以模拟实现memcpy

        

#include <assert.h>
void* my_memcpy(void* dest, void* src, size_t count)
{
    assert(dest && src);
    void*ret = dest;
    while(count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest+1;
        src = (char*)src+1;
    }
    return ret;
}

        将其放入VS执行如下:

         可以观察到:得到了与使用库函数相似的效果。

        但是在有些情况下,使用memcpy函数却并不能得出想要的效果。如在同一个字符串内复制:

         当有内存重叠时,应当避免使用memcpy函数,而应使用memmove函数。

二、memmove

1.关于memmove

        使用MSDN查看可得:

         memmove与memcpy所需的参数相同,但memcpy为内存复制函数,memmove则为内存移动函数。

2.memmove的使用

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[20] = "hello world";
    memmove(arr1+2,arr1,5);
    puts(arr1);
    return 0;
}

       在VS环境下执行可得:

         可以发现memmove并未像memcpy一样在移动时发生数据被覆盖的情况。

        接下来模拟实现memmove。

3.模拟实现memmove

        根据上例,可知在memmove中是会根据源数据地址与目的地址的不同使用不同的方法进行内存移动的,所以在模拟memmove时,也应当分情况进行内存的移动。

        画图对不同情况下的内存移动进行理解:

        根据图示可做出函数如下:

void* my_memmove(void* dest, const void* src, size_t count)
{
    assert(dest && src);
    void* ret = dest;
    if(dest < src)
    {
        // 从前向后移动
        while(count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        // 从后向前移动
        while(count--)
        {
            *((char*)dest+count) = *((char*)src + count);
        }
    }
    return ret;
}

        可得以下结果:

         与memmove函数一致。

        提示:如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

三、memcmp

1.关于memcmp

         memcmp用于比较两块内存中指定字节长度的内容并返回数值。

        在count不变时,返回的数值为正数则表示buf1所指向的内容大于buf2;为0则表示buf1和buf2相等;为负数则表示

2.memcmp的使用

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "abcdef";
    // abdd>abc
    int ret1 = memcmp("abd", arr1 ,3);
    printf("%d\n", ret1);
    // abc==abc
    int ret2 = memcmp("abc", arr1, 3);
    printf("%d\n", ret2);
    // abb<abc
    int ret3 = memcmp("abb", arr1, 3);
    printf("%d\n", ret3);
    return 0;
}

使用VS执行可得:

3.模拟实现memcmp

        可以发现,在使用memcmp进行比较时,是逐个字节进行比较然后返回不同的数值的。

        采用同样的方法进行函数的模拟:当比较的两块内存不同时,返回两个字符的差;循环count字节后仍相同,则返回0。如下:

int my_memcmp(const void* buf1, const void* buf2, size_t count)
{
    assert(buf1 && buf2);
    while(count--)
    {
        if(*(char*)buf1 != *(char*)buf2)
        {
            return *(char*)buf1 - *(char*)buf2;
        }
        buf1 = (char*)buf1 + 1;
        buf2 = (char*)buf2 + 1;
    }
    return 0;
}

        使用上例对函数进行测试,如下:

         可见与库函数memcmp的效果相同。

四、memset

1.关于memset

         memset用于对将指定地址的指定字节数设定为指定的内容。

        dest为指定空间的起始地址,c为指定初始化的内容,count为指定初始化的字节数。

2.memset的使用

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[] = "hello";
    memset(arr, '1', strlen(arr));
    puts(arr);
    return 0;
}

        在VS中执行可得:

         可以看到,使用memset将arr的strlen(arr)字节内容重置为了1。

3.模拟实现memset

void* my_memset(void* dest, int c, size_t count)
{
    assert(dest);
    while(count--)
    {
        *(char*)dest = c;
        dest = (char*)dest + 1;
    }
}

         所得效果如下:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值