你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)

我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。

目录

        #memset

        #memcpy

        #memmove

        #memcmp

        #下期预告


#memset

 

这个memcpy库函数作用是 将source位置开始向后的num个字节的内容复制到destination位置对应的内存里,而且与strncpy不同的是,memcpy可以复制任意类型的数据,而strncpy只能复制字符串,接下来看代码:

#include 
#include 

typedef struct stu
{

	char name[8];
	int age;

}stu;

void Init(stu a[])
{
	memset(a, 0, sizeof(a[0]) * 6);
}

int main()
{

	stu a[6];
	Init(a);


	return 0;
}

那么是否初始化了呢?看截图:

你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)_第1张图片

很好,全部初始化为0了 ,这个函数在初始化多个数据,类似结构体和数组时出奇的好用,推荐。

#memcpy

 

memcpy和strncpy不同之处在于,memcpy可以拷贝任意类型的数据,而strncpy只能拷贝字符。

同时memcpy要求source和destination不可以有重叠的部分,也就是说,不能自己拷贝自己,任何空间内存的重叠都不可以。

虽然说VS2022中memcpy实现了重叠部分也可以拷贝的功能,但是不保证其他编译器会实现,因为对这个函数的标准要求就是实现了不重叠部分的拷贝就可以。

#include 
#include 

int main()
{

	int arr1[10] = { 1,2,3,4,5,6 };
	int arr2[10] = { 7,8,9 };

	memcpy(arr1, arr2, 12);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ",arr1[i]);;
	}

	return 0;
}
接下来我们来模拟实现它
#include 
#include 
#include 

void* my_memcpy(void* arr1, const void* arr2, size_t num)
{
	void* ret = arr1;

	assert(arr1 && arr2);
	while (num--)
	{
		*(char*)arr1 = *(char*)arr2;
		arr1 = (char*)arr1 + 1;
		arr2 = (char*)arr2 + 1;
	}

	return ret;
}

int main()
{

	int arr1[10] = { 1,2,3,4,5,6, };
	int arr2[10] = { 7,8,9 };

	my_memcpy(arr1, arr2, 12);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ",arr1[i]);;
	}

	return 0;
}

#memmove

 memmove对他的要求就是同时实现重叠和不重叠部分的拷贝,这在哪个编译器上都一样,所以在使用内存拷贝函数的时候,最好使用memmove,功能同上。

#memcmp

你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)_第2张图片

比较从ptr1和ptr2开始的num个字节,返回值和比较方法同strcmp,前面的章节中我们讲过,也模拟实现过, 这里不多赘述。

#下期预告

qsort函数的介绍使用和模拟实现

你可能感兴趣的:(C语言,c语言)