三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

深度剖析 string —— memcpy memmove

深度剖析 string —— memcpy  memmove

系列文章目录

深度剖析:strcat & strncat
深度剖析:strchr & strstr
深度剖析:strcmp & strncmp
深度剖析:strcpy & strncpy
深度剖析:strlen & strtok
深度剖析:memcpy & memmove
深度剖析:memset & memcmp


文章目录

  • 系列文章目录
  • 前言
  • 一、memcpy
    • 1.调用结构
    • 2.使用详解
    • 3.源码剖析
  • 二、memmove
    • 1.调用结构
    • 2.使用详解
    • 3.源码剖析

前言

库函数string是我们经常使用也是非常重要的代码,我将会对常用的函数的用法和实现原理进行深度剖析


一、memcpy

1.调用结构

void*memcpy(void*dest,constvoid*src,size_tn);

2.使用详解

memcpy:从 src 复制 count 个字节到 dest

原理详解:

  1. 内存复制一个一个字节拷贝
  2. 将每个字节在内存中存储的值进行拷贝
  3. 不再局限于字符串的拷贝

3.源码剖析

void*Memcpy(void*dest,constvoid*src,size_tcount){//内存复制:从 src 复制 count 个字节到 destassert(dest&&src);char*start=dest;//记录起始位置的地址while(count--){//拷贝的字节数*(char*)dest=*(char*)src;//一个字节一个字节进行拷贝dest=(char*)dest+1;src=(char*)src+1;}returnstart;//返回起始位置的地址}

二、memmove

1.调用结构

void*memmove(void*destination,constvoid*source,size_tnum);

2.使用详解

memmove:从 src 复制 count 个字节到 dest

原理详解:

  1. 与memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  2. 如果源空间和目标空间出现重叠,就得使用memmove函数处理

3.源码剖析

void*Memmove(void*dest,void*src,intcount){//内存复制:从 src 复制 count 个字节到 destassert(dest&&src);//防止传入空指针char*start=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);}}returnstart;}
← 返回列表