C语言—内存函数

1. memcpy 使用和模拟实现

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

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>

void* my_memcpy(void* arr2, const void* arr1, size_t num)
{
    int i = 0;
    assert(arr2 && arr2);

    void* ret = arr2;

    for (i = 0; i < num; i++)
    {
        *(char*)arr2 = *(char*)arr1;
        arr2 = (char*)arr2 + 1;
        arr1 = (char*)arr1 + 1;
    }
    return arr2;
}

int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    //将arr1中的3 4 5 6 7 拷贝放到arr2中
    my_memcpy(arr2, arr1 + 2, 20);

    return 0;
}

2.memmove函数和模拟实现

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

相比于memcpy,memmove函数就是直接移动,应用面更加广。

模拟实现部分:

cpp 复制代码
#include <stdio.h>
#include <assert.h>
#include <string.h>

void* my_memmove(void* arr2, const void* arr1, size_t num)
{
    int i = 0;
    assert(arr2 && arr2);
    char* ret = arr2;
    if (arr2 < arr1)//从前向后
    {
        while (num--)
        {
            *(char*)arr2 = *(char*)arr1;
            arr2 = (char*)arr2 + 1;
            arr1 = (char*)arr1 + 1;
        }
    }
    else//从后到前
    { 
        while (num--)
        {
            *((char*)arr2 + num) = *((char*)arr1 + num);
        }
    }
    return ret;
}

int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    //将arr1中的3 4 5 6 7 拷贝放到arr2中
    my_memmove(arr1 + 2, arr1, 20);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr1[i]);
    }
    return 0;
}

3. memset 函数的使用

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

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

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = "hello world";
    memset(arr + 6, 'x', 5);
    printf("%s", arr);

    return 0;
}

输出结果:hello xxxxx

但是:

并没有出现前四个数组内容是1。原因在于"以字节为单位"。

四个1都赋值到arr【1】中,最后形成了一个非常大的数字。

4.memcmp 函数的使用

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

  • 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。
cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    int arr1[] = { 1,2,3,4,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 00 05 00 00 00 00
    int arr2[] = { 1,2,3,6,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 00 05 00 00 00 00
    memcmp(arr1, arr2, 12);//返回值为0
    memcmp(arr1, arr2, 12);//返回值为-1

    return 0;
}

作者自述:本文主要针对C语言的内存函数的知识。内容中包含了很多总结内容。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

相关推荐
isyangli_blog3 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008113 小时前
FastAPI APIRouter
开发语言·python
Benszen3 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆3 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木3 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充4 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~4 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6164 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草4 小时前
反射、Tomcat执行
java·开发语言
雪的季节5 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt