【C语言内存函数】

目录

1.memcpy

使用

模拟实现

2.memmove

使用

模拟实现

3.memset

使用

4.memcmp

使用


1.memcpy

使用

void * memcpy ( void * destination, const void * source, size_t num );
                       目的地址                源地址        字节数

destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。

source:指向要复制的数据源的指针,类型转换为const void*类型的指针。

num:要复制的字节数。size_t是一个无符号整数类型。

1.函数memcpy从源地址(destimation)的位置开始向后复制num个字节的数据到目的地址(source)指向的内存位置

2.这个函数在遇到 '\0' 的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的。

演示:

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 20);
	//从arr1->arr2     20个字节
	int i = 0;
//这里打印10个方便查看
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

结果:

模拟实现

void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest);//判断是否为空
	assert(src);
	void* ret = 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[10] = { 0 };
	my_memcpy(arr2, arr1, 20);
	//从arr1->arr2     20个字节
	int i = 0;
//这里打印10个方便查看
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

结果:

2.memmove

使用

其实跟memcpy差不多

void * memmove ( void * destination, const void * source, size_t num );
                        目的地址                源地址        字节数

destination:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
source:指向要复制的数据源的指针,类型转换为constvoid*类型的指针。
num:要复制的字节数。size t是一个无符号整数类型。

1.将num字节的值从源地址指向的位置复制到目的地址指向的内存块。

2.复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。

3.当源地址看见和目标地址出现重叠,可以使用memmove


 演示一下,如何重叠的

将源地址的数据传入源地址内(实现在同一个看见重叠)

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//将源地址数据传入(源地址+2) 发生重叠
	memmove(arr + 2, arr, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这里传入的20个字节  从(arr+2)开始   后面20个字节进行重叠

模拟实现

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(src);//判断是否为空

	void* ret = dest;//防止返回的地址变动
//这里进行判断位置  从哪里开始进行替换
	if (dest <= src || (char*)dest >= ((char*)src + count)) {
		while (count--) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else {
		dest = (char*)dest + count - 1;
		src = (char*)src + count - 1;
		while (count--) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

结果:

3.memset

使用

void * memset ( void * ptr, int value, size_t num );
                    源地址   要变的内容   字节数

ptr指针,指向要填充的内存块。
value:进行设置。该值以int形式传递,但函数使用该值的无符号字符转换填充内存块。
num:要设置为值的字节数。size_t是一个无符号整数类型。

1.设置内存,将内存中的值以字节为单位设置成想要的内容。

这里就不模拟了(循环替换)

int main()
{
	char str[] = "hello qingtian";
	memset(str, 'x', 5);
	printf(str);
	return 0;
}

结果:

4.memcmp

使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
                地址1                   地址2        字节数

ptr1:内存块的指针。
ptr2:内存块的指针。
num:要比较的字节数。

1.进行比较ptr1和ptr2 从0开始比较num个

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abdd";
	int n;
	n = memcmp(arr1, arr2, sizeof(arr2));
	if (n > 0)
		printf("'%s' 大于 '%s'\n", arr1, arr2);
	else if (n < 0)
		printf("'%s' 小于 '%s'\n", arr1, arr2);
	else
		printf("'%s' 等于 '%s'\n", arr1, arr2);
	return 0;
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 23:46:07       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 23:46:07       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 23:46:07       58 阅读
  4. Python语言-面向对象

    2024-07-09 23:46:07       69 阅读

热门阅读

  1. 浅谈贝叶斯定理

    2024-07-09 23:46:07       22 阅读
  2. ClickHouse中PRIMARY KEY和ORDER BY关键字的关系

    2024-07-09 23:46:07       21 阅读
  3. 基于Go 1.19的站点模板爬虫

    2024-07-09 23:46:07       24 阅读
  4. C++中的进程和线程的通信交互

    2024-07-09 23:46:07       24 阅读
  5. 如何保证Kafka顺序消费

    2024-07-09 23:46:07       23 阅读
  6. 深入理解Symfony调试工具:从原理到实践

    2024-07-09 23:46:07       26 阅读
  7. 把 .py 文件编译成 .pyd 文件

    2024-07-09 23:46:07       24 阅读
  8. 后端工作之一:CrapApi —— API接口管理系统部署

    2024-07-09 23:46:07       21 阅读
  9. C++ 11 智能指针使用详解

    2024-07-09 23:46:07       17 阅读
  10. Perl 数据类型

    2024-07-09 23:46:07       23 阅读
  11. nvm下载

    nvm下载

    2024-07-09 23:46:07      17 阅读
  12. Python中的格式化输出

    2024-07-09 23:46:07       21 阅读
  13. Ubuntu、CentOs更换源(阿里云的源)

    2024-07-09 23:46:07       21 阅读