【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;
}
相关推荐
lly2024061 小时前
HTML与CSS:构建网页的基石
开发语言
一只会写代码的猫1 小时前
面向高性能计算与网络服务的C++微内核架构设计与多线程优化实践探索与经验分享
java·开发语言·jvm
是小胡嘛3 小时前
C++之Any类的模拟实现
linux·开发语言·c++
口袋物联3 小时前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
csbysj20204 小时前
Vue.js 混入:深入理解与最佳实践
开发语言
Gerardisite5 小时前
如何在微信个人号开发中有效管理API接口?
java·开发语言·python·微信·php
Want5955 小时前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa5 小时前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
coderxiaohan6 小时前
【C++】多态
开发语言·c++
gfdhy6 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希