- c语言常用内存函数详解
- 0、前言
- 1、memcpy
- memcpy的模拟实现
- 2、memmove
- memmove模拟实现
- 3、memcmp
- 4、memset
- 5、总结
内存函数,即对内存中的内容进行一定的操作,通过这种函数,我们并不会局限与数据的类型,比如我我们希望将一个空间的内容拷贝到另一个空间中,如果是字符串我们可以用strcpy来解决,但其余数据类型strcpy就爱莫能助了,这时,我们就需要用到内存函数了,我们直接一个字节一个字节的拷贝过去,一样能达成我们想要的效果,并且不拘泥于具体的类型。下面我就为大家介绍这些常用的内存函数。
1、memcpyvoid* memcpy(void* dest,const void* src,size_t num)
{
}
让我们来看看memcpy这个函数,两个void* 的参数,让其能接收任意类型的指针,这个函数的意思就是把src指向的空间中num个字节的数据拷贝到dest指向的空间中。返回值是void* ,是目标空间的起始地址。
memcpy负责拷贝两块独立空间中的数据。
memcpy的模拟实现#define _CRT_SECURE_NO_WARNINGS #include#include void* my_memcpy(void* dst, void* src, size_t num) { assert(dst && src); void* tmp = dst; while (num--) { *(char*)dst = *(char*)src; //需要进行强制转换 dst = (char*)dst + 1; src = (char*)src + 1; } return tmp; } int main(void) { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int arr2[10] = { 0 }; my_memcpy(arr2, arr, sizeof(int)*5); for (int i = 0;i < 10;++i) { printf("%d ", arr2[i]); } return 0; }
注意:如果dst和src两者指向的内容重叠,其复制的结果是未定义的。下面的memmove则可解决这一问题。
2、memmovevoid* my_memmove(void* dest, const void* src,size_t num)
{
}
那么接下来就是想办法实现memmove的时候了,我们直到memcpy有时并不能够解决复制重叠的内容的问题,
接下来我们就需要好好讨论一下如何能够解决该种情况,然后再在上面代码的基础上进行改变,让我们能够模拟实现好memmove这个库函数,接下来我将分为三种情况来进行分析:
第一种:
从这种情况我们可以看到,我们需要把01234拷贝到23456所在的空间中,这个时候像下图这样从后向前一个个拷贝方可:
第二种:
这种情况我们可以看到,我们只需要把src指向的数据从前到后一个个拷贝到dst所指向的空间即可。
第三种:
这种情况无论使用那种情况都可以。
总结:
src > dst -----> 需要从后向前进行拷贝
src< dst ------>需要从前向后进行拷贝
src= dst ------->无需进行操作
那么经过一番分析后,接下来我们就开始实现我们的代码吧!。
memmove模拟实现#define _CRT_SECURE_NO_WARNINGS #include#include void* my_memset(void* dst, void* src, size_t num) { assert(dst && src); void* ret = dst; if (dst > src) { while (num--) { //后置--,先使用再--, *((char*)dst + num) = *((char*)src + num); } } else if (dst == src) { //相等时直接不进行操作 ; } else{ *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return ret; } int main(void) { int arr[] = {0,1,2,3,4,5,6,7,8,9}; my_memset(arr + 2, arr, 20); for (int i = 0;i < 10;++i) { printf("%d ", arr[i]); } return 0; }
运行结果:
3、memcmpint memcmp( const void *buf1, const void *buf2, size_t count )
{
}
memcpy函数就是将buf1指向的空间的内容一个字节一个字节与buf2所指向的空间中的内容进行比较,比较的字节个数为count。
返回值 :
| Return Value | Relationship of First count Bytes of buf1 and buf2 |
|---|---|
| < 0 | buf1 less than buf2 |
| 0 | buf1 identical to buf2 |
| > 0 | buf1 greater than buf2 |
memcmp函数的模拟实现也足够简单,相信经过上面的模拟实现后这个应该会变得很轻松,这里就不过多赘述了。
4、memsetvoid *memset( void *dest, int c, size_t count )
{
}
memset有什么作用呢? memset会将dest所指向的空间的count个字节的内容初始化为c ,这个函数能让我们一个字节一个字节的初始化,使用起来有时会更加便利。
该函数的模拟实现也就不过多赘述了。
5、总结到这里,常用的内存函数的介绍也就完了,希望大家都能从中汲取到有用的内容,感觉不错的可以帮忙点个赞哦。
`



