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

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

memcpy


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

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

说明:

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

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

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

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

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

应用如下:

拷贝结构体代码如下


1. #include <stdio.h>
2. #include <string.h>
3. struct {
4.  char name[40];
5.  int age;
6. } person, person_copy;
7. int main()
8. {
9.  char myname[] = "Pierre de Fermat";
10.   memcpy(person.name, myname, strlen(myname) + 1);
11.   person.age = 46;
12.   memcpy(&person_copy, &person, sizeof(person));
13.   printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
14.   return 0;
15. }

结果如下

注意 :source和destination所指内存区域不能重叠。num的单位为字节


模拟实现memcpy


模拟实现memmcpy,只需要从source指向地址为起始地址连续n个字节的数据复制到以destination指向地址为起始地址的空间内即可,注意因为memcpy可以拷贝任何数据,所以这里我们无论函数的返回值还是参数都应该为void*

my_memcpy格式如下

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

实现代码如下

1. //void* my_memcpy(void* dest, const void* src, size_t num)
2. //{
3. // void* ret = dest;//记录起始地址
4. // assert(src && dest);//断言,防止传进来空指针
5. //
6. // while (num--)//循环num次,复制num个字节
7. // {
8. //   *(char*)dest = *(char*)src;//以char*为单位,强制转换为char*
9. //   dest = (char*)dest + 1;
10. //    src = (char*)src + 1;
11. //  }
12. //  return ret;
13. //}

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

1. //   dest = (char*)dest + 1;
2. //   src = (char*)src + 1;

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


memmove


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

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

说明:

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

使用如下


模拟实现memmove


模拟实现memove只需要想怎么才处理重叠源内存块和目标内存块就好,实现格式如下

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

这里我们可以分情况进行讨论

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

具体函数实现如下

1. //void* my_memmove(void* dest, const void* src, size_t num)
2. //{
3. // void* ret = dest;//记录起始地址
4. // assert(dest && src);//断言
5. //
6. // if (dest < src)
7. // {
8. //   //前->后
9. //   while (num--)
10. //    {
11. //      *(char*)dest = *(char*)src;
12. //      dest = (char*)dest + 1;
13. //      src = (char*)src + 1;
14. //    }
15. //  }
16. //  else
17. //  {
18. //    //后->前
19. //    while (num--)//20
20. //    {
21. //      *((char*)dest + num) = *((char*)src + num);
22. //    }
23. //  }
24. //  return ret;
25. //}

memcmp


比较从ptr1和ptr2指针开始的num个字节 ,可以比较任意类型的数据,格式如下

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

说明:

使用如下

 

 

结尾


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

相关文章
|
4天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
33 0
|
4天前
|
编译器 C语言 C++
【C语言】realloc()函数详解(动态内存开辟函数)
【C语言】realloc()函数详解(动态内存开辟函数)
30 0
|
4天前
|
编译器 C语言 C++
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
71 2
|
4天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
27 0
|
4天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
46 0
|
4天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
3天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
17 0
|
4天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
26 0
|
4天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
16 2
|
4天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
18 0