1、memcpy

void * memcpy ( void * destination, const void * source, size_t num );

   size_t num  表示 要拷贝的 数据占的字节数

从 source 的 位置 开始向后复制num个字节数据到destination中指向的内存位置,若空间有重叠,复制的结果为未定义的

int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[10] = { 0 };
    memcpy(arr2, arr1, 20);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d", arr2[i]);
    }
    return 0;
}

strcpy 只能拷贝字符串,遇到 '\0' 就停;

memcpy 可以拷贝任意数据,你让它拷多少就拷多少。

memcpy 你指定长度,它就拷多少

不管里面有没有 \0,不管是什么数据

memcpy 完成内存块拷贝的,不关注内存中的数据是什么类型  所以用 void*

2、memmove  

与memcpy  的差别是 函数处理的原内存块和目标内存块是可以重叠的

void * memmove ( void * destination, const void * source, size_t num );

void* my_memmove(void* dest, const void* src, sizr_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);
        }
    }
    return ret;
}

3、memset 用来设置内存块的内容,将内存中指定长度的空间设置为特定的内容

void * memset ( void * ptr, int value, size_t num );

ptr 指针指向要设置的内存空间要存放的内存空间的起始地址

int main()
{
    char arr[] = "hello world";
    memset(arr, 'x', 5);
    printf("%s\n", arr);
    return 0;
}

4、memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

比较指定的两块内存的从内容,比较ptr1 和 ptr2 指针指向的位置开始,向后num 个字节

小结:如果要比较2快内存的空间的数据大小,可以使用memcmp函数,这个函数的特点就是可以指定此数的长度,memcmp 就是 通过返回值告知大小关系

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐