【C语言进阶】- 内存函数

内存函数

    • [1.1 内存函数的使用](#1.1 内存函数的使用)
    • [1.2 memcpy函数的使用](#1.2 memcpy函数的使用)
    • [1.3 memcpy函数的模拟实现](#1.3 memcpy函数的模拟实现)
    • [2.1 memmove函数的使用](#2.1 memmove函数的使用)
    • [2.2 memmove函数的模拟实现](#2.2 memmove函数的模拟实现)
    • [2.3 memcmp函数的使用](#2.3 memcmp函数的使用)
    • [2.4 memset函数的使用](#2.4 memset函数的使用)

1.1 内存函数的使用

内存函数就是对内存中的数据进行操作的函数

1.2 memcpy函数的使用

void* memcpy ( void * destination, const void * source, size_t num );
src 往 dest 传递数据的字节数

不用来处理重叠的内存之间的数据拷贝

c 复制代码
#include <stdio.h>
#include <string.h>
#include <assert.h>

void test1()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 28); // 从arr1中拷贝28个字节的数据给到arr1

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

	float arr3[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };
	float arr4[10] = { 0 };
	// 可以传递任意类型
	memcpy(arr4, arr3, 28);
}
int main()
{
	test1();
	return 0;
}

1.3 memcpy函数的模拟实现

c 复制代码
// 返回dest的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	// 记录起始地址
	void* ret = dest;

	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;

}

2.1 memmove函数的使用

void* memmove ( void* destination, const void* source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

c 复制代码
void test2()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[10] = { 0 };
	memmove(arr1+2, arr1, 20); // 可以重叠拷贝

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

}

int main()
{
	test2();
	return 0;
}

2.2 memmove函数的模拟实现

c 复制代码
// 返回dest的起始地址
// dest在src之前时,从前往后遍历
// src与dest重叠时,从前往后拷贝数据和从后往前都可以
// dest在src之后时,从后往前遍历
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	// 记录起始位置
	int ret = dest;

	// 从前往后
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}

	}
	// 从后往前 -> dest >= src
	else
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src + num);
		}
	}

	return ret;

}

2.3 memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这里比较的是内存中的每个字节中所存储的数的大小

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{

	// 这里比较的是内存中的每个字节中所存储的数的大小
	int arr1[] = { 1,2,3,4 }; // 01 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00 
	int arr2[] = { 1,3,2 };   // 01 00 00 00 | 03 00 00 00 | 02 00 00 00 | 04 00 00 00 
							  //                ^
	int ret = memcmp(arr1, arr2, 12);
	printf("%d\n",ret);
	return 0;
}

2.4 memset函数的使用

memset 内存设置,以字节为单位处理

void* memset( void* dest, 要设置的元素

int value, 要更改的元素

size_t size 更改几个

);

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "hello world";
	memset(arr, 'x', 5);
	//memset(arr+6, 'x', 3); // hello xxxld
	printf("%s\n",arr);

	return 0;
}
相关推荐
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE7 小时前
PHP纹路验证码
开发语言·php
仟濹7 小时前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥7 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚7 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
八零后琐话7 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
3GPP仿真实验室7 小时前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
知南x8 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
忆~遂愿8 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
Ro Jace8 小时前
计算机专业基础教材
java·开发语言