内存函数相关讲解与模拟实现

目录

memcpy

模拟实现memcpy

memmove

模拟实现memmove

memcmp

memset

memcpy

由 source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间内。格式如下

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

说明: 

1、函数返回一个指向desinationt的指针。搭配头文件#include使用

2、source和destination所指内存区域不能重叠

3、与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

4、strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度

5、如果目标数组destination本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址

应用如下:

拷贝结构体代码如下

#include
#include
struct {
    char name[40];
    int age;
} person, person_copy;
int main()
{
    char myname[] = "Pierre de Fermat";
    memcpy(person.name, myname, strlen(myname) + 1);
    person.age = 46;
    memcpy(&person_copy, &person, sizeof(person));
    printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
    return 0;
}

结果如下

 注意 :source和destination所指内存区域不能重叠。num的单位为字节
 模拟实现memcpy
模拟实现memmcpy,只需要从source指向地址为起始地址连续n个字节的数据复制到以destination指向地址为起始地址的空间内即可,注意因为memcpy可以拷贝任何数据,所以这里我们无论函数的返回值还是参数都应该为void*
 my_memcpy格式如下

void* my_memcpy(void* dest, const void* src, size_t num)

实现代码如下 

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

void* my_memcpy(void* dest, const void* src, size_t num)

{

void* ret = dest;

assert(src && dest);

while (num--)

{

*(char*)dest = *(char*)src;

dest = (char*)dest + 1;

src = (char*)src + 1;

}

return ret;

}

int main()

{

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

int arr2[] = { 5,6,7,8,9,10 };

my_memcpy(arr1+2, arr2, 20);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d ", arr1[i]);

}

return 0;

}

 关于强制转换为char*的意义图解

内存函数相关讲解与模拟实现_第1张图片

内存函数相关讲解与模拟实现_第2张图片

内存函数相关讲解与模拟实现_第3张图片

注意 此处代码不可以用dest++和src++进行代替。原因是虽然上一句代码进行了数据转换,但是那只是临时转换,如果用dest++,那么一次跳过的就不是一个字节了,而是dest所对应的字节;而按照上述代码书写则一次只跳一个字节。 

memmove

memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。格式如下

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

说明: 

如果源空间和目标空间出现重叠,就得使用memmove函数处理

内存函数相关讲解与模拟实现_第4张图片

内存函数相关讲解与模拟实现_第5张图片

内存函数相关讲解与模拟实现_第6张图片

内存函数相关讲解与模拟实现_第7张图片

其他情况便可以从前向后进行复制

具体函数实现如下

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include

#include

void* my_memmove(void* dest, const void* src, size_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--)//20

{

*((char*)dest + num) = *((char*)src + num);

}

}

return ret;

}

int main()

{

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

my_memmove(arr1, arr1+2, 20);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d ", arr1[i]);

}

return 0;

}

memcmp
 

比较从 ptr1 和 ptr2 指针开始的 num 个字节 ,可以比较任意类型的数据,格式如下
int memcmp ( const void * ptr1, const void * ptr2, size_t num )

内存函数相关讲解与模拟实现_第8张图片

内存函数相关讲解与模拟实现_第9张图片

内存函数相关讲解与模拟实现_第10张图片

memset 

内存函数相关讲解与模拟实现_第11张图片

内存设置

 把prt前num个字节的内容设置成想要的value值

eg:

arr[]="hello Henry"

memset(arr,'x',4)

arr[]="hxxxx Henry"

以上就是我对内存函数的相关讲解和部分模拟实现,讲解有不清楚或者讲错的地方,可以在评论区或者私信.看完记得点赞哦!!! 

你可能感兴趣的:(算法,数据结构)