五分钟搞懂内存函数

内存函数的种类

  1. memcpy

  2. memmove

  3. memcmp

  4. memset

memcpy 

void* memcpy (void* dest, const void* sour,size_t num)

int arr[] = {1,23,4,5,6,7,8,9,10};
int arr2[10] = {0};
memcpy(arr2,arr,20);//memcpy功能和字符串函数strncpy类似 使用范围更大 适用于任何类型的数据
(void* 接收任何类型) 内存拷贝
float arr1[] = {1.0f,2.0f,3.0f,4.0f};
float arr2[5] = {0.0};
memcpy(arr2,arr1,8);
/*
1.0 double类型
1.0f float类型
*/

memcpy的模拟实现

假设小端存储

arr1的内存布局

低地址                                                                 高地址

01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00

01  一个字节一个字节的复制

void my_memcpy(void* dest, void* sour, size_t num)
{
    *(char*)dest = *(char*)sour;//强转成char*类型 解引用
    ((char*)dest)++; // 先强转再自增
    ((char*)sour)++;
}

my_memcpy(arr2,arr1,20);

考虑一种特殊情况 “自己拷贝到自己”

arr1[] = {1,2,3,4,5,6,7,8,9,10};

4,5,6,7,8 为dest

6,7,8,9,10 为src

用常规的从前向后复制则会出现这种情况 dest 4,5,4,5,4

因为重叠部分被破坏 所以得从后往前复制

1 2 3 4 5 6 7 8 9 10 

1. dest 和str 不重叠 任意复制即可

2.dest 在str前面 即从前向后

3. dest 在str后面 即从后向前

其实这种情况我们通常会使用 memmove函数 “重叠内存的拷贝”

但在VS上memcpy函数 不仅不重叠拷贝可以实现,重叠内存拷贝也可以实现

memmove代码模拟实现

if(dest < src) // 从前向后
{
    while(num--)
    {
        //前面有
    }
}
else
{
    while(num--)
    {
        *((char*)dest + num) =
        *((char*)src + num);
    /*
        先强转成char*类型 再+num个字节 指向末端
    */
    }
}

memcmp

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

功能 内存比较 类似于字符串函数strncmp (都是一对字节一对字节来比较)

两者差异 参数类型

memset - 内存设置

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

指针指向一块内存

int arr[] = {1,2,3,4,5};

memset(arr,0,8); 2*4

// 将arr内存存储的 8个字节(即两个int)设置为 0

arr原本内存布局

01 00 00 00

02 00 00 00

03 00 00 00

04 00 00 00

05 00 00 00

设置后内存布局

00 00 00 00

00 00 00 00

03 00 00 00

04 00 00 00

05 00 00 00

总结

以上就是内存函数的全部内容啦 喜欢的朋友可以一键三连 你的点赞是我创作的动力🙏 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值