内存函数,即对内存中的内容进行一定的操作,通过这种函数,我们并不会局限与数据的类型,比如我我们希望将一个空间的内容拷贝到另一个空间中,如果是字符串我们可以用strcpy来解决,但其余数据类型strcpy就爱莫能助了,这时,我们就需要用到内存函数了,我们直接一个字节一个字节的拷贝过去,一样能达成我们想要的效果,并且不拘泥于具体的类型。下面我就为大家介绍这些常用的内存函数。
void* memcpy(void* dest,const void* src,size_t num)
{
}
让我们来看看memcpy这个函数,两个void* 的参数,让其能接收任意类型的指针,这个函数的意思就是把src指向的空间中num个字节的数据拷贝到dest指向的空间中。返回值是void* ,是目标空间的起始地址。
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则可解决这一问题。
void* my_memmove(void* dest, const void* src,size_t num)
{
}
那么接下来就是想办法实现memmove的时候了,我们直到memcpy有时并不能够解决复制重叠的内容的问题,
接下来我们就需要好好讨论一下如何能够解决该种情况,然后再在上面代码的基础上进行改变,让我们能够模拟实现好memmove这个库函数,接下来我将分为三种情况来进行分析:
第一种:
从这种情况我们可以看到,我们需要把01234拷贝到23456所在的空间中,这个时候像下图这样从后向前一个个拷贝方可:
第二种:
这种情况我们可以看到,我们只需要把src指向的数据从前到后一个个拷贝到dst所指向的空间即可。
第三种:
这种情况无论使用那种情况都可以。
总结:
src > dst -----> 需要从后向前进行拷贝
src< dst ------>需要从前向后进行拷贝
src= dst ------->无需进行操作
那么经过一番分析后,接下来我们就开始实现我们的代码吧!。
#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;
}
运行结果:
int 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函数的模拟实现也足够简单,相信经过上面的模拟实现后这个应该会变得很轻松,这里就不过多赘述了。
void *memset( void *dest, int c, size_t count )
{
}
memset有什么作用呢? memset会将dest所指向的空间的count个字节的内容初始化为c ,这个函数能让我们一个字节一个字节的初始化,使用起来有时会更加便利。
该函数的模拟实现也就不过多赘述了。
到这里,常用的内存函数的介绍也就完了,希望大家都能从中汲取到有用的内容,感觉不错的可以帮忙点个赞哦。
`