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

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

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 <stdio.h>
#include <string.h>
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;
}


结果如下

6385944d9d924353b6e4388ef3fb5752.png

注意 :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 <stdio.h>
#include <string.h>
#include <assert.h>
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*的意义图解


1991a5f6962749588b483b0ca9482e86.png

fc3f527cd1444586b69be09cfcf7eac9.png

a957baa75c7541a996f4bdac052c7157.png



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


memmove


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


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


说明:


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

2cced96f85f44a4292a02ab52d21f276.png


b583e0bee2de4a0f81b8b80d73074ebb.png






741a8883a100402ca1c36f1cb21f0b28.png



4a3d1d66430647f7bb7639c3e364e69e.png



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


具体函数实现如下


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
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 )


a4e782c313cf4a8ca692ab474774ebc9.png


6746565999674703b3f8d71514e23420.png

fa92b78cbe844f17bf30e7403060203b.png

ca8a92a1fcd14f91ae5cd1e64c6bf26c.png



memset


b243e24c517849be8b99bc8eeee5b11f.png

内存设置

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

eg:


arr[]="hello Henry"
memset(arr,'x',4)
arr[]="hxxxx Henry"


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


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
5月前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
68 0
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
191 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
30天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
25 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
41 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
66 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
70 0