C语言进阶之内存操作函数详解

 更新时间:2023年07月26日 16:49:48   作者:灰灰快醒醒  
这篇文章主要为大家学习介绍了C语言中内存操作函数(memcpy、memmove和memcmp)的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

内存操作函数

memcpy

头文件:string.h

基本用途:进行不相关(不重叠的内存)拷贝。

函数原型:

void* memcpy(void* destination,//指向目标数据的指针
const void* source,//指向被拷贝数据的指针
size_t num);//拷贝的数量(单位:字节)

注:

1.基本原理:从source的位置开始向后复制num个字节的数据到destnation的内存位置。

2.这个函数与strcpy不同,它遇见'\0'的时候并不会停下来。

3.如果source和destnation有任何的重叠,复制的结果都是未定义的。

4.void* 之前讲过,为了保证泛用性,使用void*接收任意类型的数据。

使用举例:

#include <stdio.h>
#include <string.h>
struct {
	char name[40];
	int age;
}person, person_copy;
int main()
{
	char myname[] = "Pierre de Fermat";
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;
	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s , %d\n", person_copy.name, person_copy.age);
	return 0;
}

这是将字符串和结构体成员变量拷贝到另一个结构体的举例。

为了更好的理解这一函数,下面我们来模拟实现一下它。

void* my_memcpy(void* dest, const void* src, size_t num)
{
	//断言,防止dest或者src是空指针,如果是空指针则会报错
	assert(dest && src);
	//保存起始地址
	void* ret = dest;
	while (num--)
	{
		//一次用最小单位(字节)移动,保证泛用性
		*(char*)dest = *(char*)src;
		//注:强制类型转换只是临时的,后面+1操作时已不存在
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	//返回目标空间的起始地址
	return ret;
}

memmove

头文件:string.h

基本用途:重叠内存块的拷贝。

函数原型:

void* memove(void* destnation, const void* source, size_t num)

注:

1.和memcpy的区别就是memove函数处理的源内存块和目标内存块可以重叠。

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

使用举例:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "memmove can be very useful.....................";
	//将字符串中从第15个元素的位置向后数共11个字符挪到从第20个字符开始向后数第11个元素
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

该函数的模拟实现:

#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	//当目标位置地址小于源内存块数据地址时,采用从前向后拷贝的方式
	if (dest < src)
	{
		//根据字节数量一个一个移动内存单元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向后移动一位
			dest = (char*)dest + 1;
			src = (char*)dest + 1;
		}
	}
	//当目标为指针大于源内存块数据地址时,采用从后向前的拷贝方式
	else if (dest > src)
	{
		//将dest和src指针定位到各自最后的内存地址处
		dest = (char*)dest + num - 1;
		src = (char*)src + num - 1;
		//根据字节数量一个一个移动内存单元
		while (num--)
		{
			*(char*)dest = *(char*)src;
			//向前移动一位
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
}

memcmp

头文件:stdio.h

基本用途:顾名思义,与strcmp函数类似,这个函数是比较内存数据大小的(逐字节)。

函数原型:

int memcmp(const void* ptr1, const void* ptr2, size_t num);

注:

1.比较从ptr1和ptr2开始的num个字节

2.与strcmp返回值类似,仍是第一个指针内容大于第二个指针的内容,返回大于零的数字,第一个指针内容小于第二个指针的内容,返回小于零的数字,相等,返回零。

基本举例:

#include <stdio.h>
#include <string.h>
int main()
{
	char buffer1[] = "axxxxxxxxxxx";
	char buffer2[] = "bbbbbbbbbbbb";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	printf("%d", n);
	return 0;
}

结果:

到此这篇关于C语言进阶之内存操作函数详解的文章就介绍到这了,更多相关C语言内存操作函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 如何在C++中调用python代码你知道吗

    如何在C++中调用python代码你知道吗

    这篇文章主要为大家介绍了C++中调用python代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C语言 while语句的用法详解

    C语言 while语句的用法详解

    本文主要介绍C语言while 语句,这里对while 循环做详细讲解,并提供示例代码,希望能帮助学习C语言的同学
    2016-07-07
  • Linux/Manjaro如何配置Vscode的C/C++编译环境

    Linux/Manjaro如何配置Vscode的C/C++编译环境

    这篇文章主要介绍了Linux/Manjaro配置Vscode的C/C++编译环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • c++连接mysql入门案例

    c++连接mysql入门案例

    这篇文章主要介绍了c++连接mysql入门案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++保存HBITMAP为位图文件的实现方法

    C++保存HBITMAP为位图文件的实现方法

    这篇文章主要介绍了C++保存HBITMAP为位图文件的实现方法,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2021-01-01
  • 利用C/C++实现较完整贪吃蛇游戏

    利用C/C++实现较完整贪吃蛇游戏

    这篇文章主要为大家详细介绍了利用C/C++实现较完整贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C语言打印菱形实例详解

    C语言打印菱形实例详解

    这篇文章主要给大家介绍了关于C语言如何打印菱形的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C语言中动态内存管理初学者容易犯的6个错误分享

    C语言中动态内存管理初学者容易犯的6个错误分享

    本篇文章主要介绍了初学者使用C语言中动态内存管理的4个函数时最容易犯的6个错误,以及如何避免这些错误,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-04-04
  • 如何在C语言的宏中使用类型关键字

    如何在C语言的宏中使用类型关键字

    如何在C语言的宏中使用类型关键字呢?以下是实现方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C语言中如何实现桶排序

    C语言中如何实现桶排序

    这篇文章主要介绍了C语言中如何实现桶排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论