c语言常用内存函数详解

c语言常用内存函数详解

文章目录

  • c语言常用内存函数详解
      • 0、前言
      • 1、memcpy
        • memcpy的模拟实现
      • 2、memmove
        • memmove模拟实现
      • 3、memcmp
      • 4、memset
      • 5、总结

0、前言

​ 内存函数,即对内存中的内容进行一定的操作,通过这种函数,我们并不会局限与数据的类型,比如我我们希望将一个空间的内容拷贝到另一个空间中,如果是字符串我们可以用strcpy来解决,但其余数据类型strcpy就爱莫能助了,这时,我们就需要用到内存函数了,我们直接一个字节一个字节的拷贝过去,一样能达成我们想要的效果,并且不拘泥于具体的类型。下面我就为大家介绍这些常用的内存函数。

1、memcpy

void* 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;
}

c语言常用内存函数详解_第1张图片

注意:如果dst和src两者指向的内容重叠,其复制的结果是未定义的。下面的memmove则可解决这一问题。

2、memmove

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

那么接下来就是想办法实现memmove的时候了,我们直到memcpy有时并不能够解决复制重叠的内容的问题,

接下来我们就需要好好讨论一下如何能够解决该种情况,然后再在上面代码的基础上进行改变,让我们能够模拟实现好memmove这个库函数,接下来我将分为三种情况来进行分析:

第一种:

c语言常用内存函数详解_第2张图片

从这种情况我们可以看到,我们需要把01234拷贝到23456所在的空间中,这个时候像下图这样从后向前一个个拷贝方可:c语言常用内存函数详解_第3张图片

第二种

c语言常用内存函数详解_第4张图片

这种情况我们可以看到,我们只需要把src指向的数据从前到后一个个拷贝到dst所指向的空间即可。

第三种:

c语言常用内存函数详解_第5张图片

这种情况无论使用那种情况都可以。

总结:

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;
}

运行结果:

c语言常用内存函数详解_第6张图片

3、memcmp

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函数的模拟实现也足够简单,相信经过上面的模拟实现后这个应该会变得很轻松,这里就不过多赘述了。

4、memset

void *memset( void *dest, int c, size_t count )
{
}

memset有什么作用呢? memset会将dest所指向的空间的count个字节的内容初始化为c ,这个函数能让我们一个字节一个字节的初始化,使用起来有时会更加便利。

该函数的模拟实现也就不过多赘述了。

5、总结

到这里,常用的内存函数的介绍也就完了,希望大家都能从中汲取到有用的内容,感觉不错的可以帮忙点个赞哦。
`

你可能感兴趣的:(c语言训练,c语言,c++,开发语言)