我是靠谱客的博主 故意黑米,最近开发中收集的这篇文章主要介绍C语言——模拟实现memcpy函数和memmove函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一.memcpy函数

1.函数简介

2.具体代码

什么是断言

什么是size_t

3.对比截图

二.memmove函数

1.函数简介

2.具体代码

3.对比截图


一.memcpy函数

1.函数简介

函数原型void *memcpy(void *destin, void *source, unsigned n);

参数

  • destin -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

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

  • n -- 要被复制的字节数。

返回值:该函数返回一个指向目标存储区destin的指针。

函数功能:从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。

头文件:C语言:#include<string.h>

               C++:#include<cstring>

2.具体代码

什么是断言:

断言概念:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。

用法:void assert(int test);

头文件#include<assert.h>

作用:如果它的条件返回错误,则终止程序执行

注意:assert是宏,而不是函数。

什么是size_t:

        它是一种“整型”类型,里面保存的是一个整数,就像int、long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。

        在这里,我们可以简单理解为 unsigned int ( 无符号整型 ) 就可以了。

#include<stdio.h>
#include<string.h>
#include<assert.h>

void *mymemcpy(void *destin, void *source, size_t n){
	assert(destin != NULL);
	for (int i = 0; i < n; i++){//会出现类型不匹配的警告
    //修改为
    //for (size_t i = 0; i < n; i++){
		*((char *)destin + i) = *((char *)source + i);
	}
	return destin;
}

void main()
{
	char destin[100] = { 0 };
	char source[] = "hello";
	printf("%sn", mymemcpy(destin, source, 3));
	printf("%sn", memcpy(destin, source, 3));
}

PS:在运行中可能会出现如下警告,这是因为 n 被定义为: unsigned int 类型,而 i 是int 类型,虽然不影响运行结果,但是想要解决的话就是把for循环中定义的i的类型由int 改为size_t,这样就不会出现该警告了。

3.对比截图

二.memmove函数

1.函数简介

原型void *memmove( void* dest, const void* src, size_t count );

功能:由src所指内存区域复制count个字节到dest所指内存区域。

头文件:<string.h>

说明:memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

2.具体代码

#include<stdio.h>
#include<string.h>
#include<assert.h>

void *mymemmove(void* dest, const void* src, size_t count){
	assert(dest != NULL&&src != NULL);
	char *d = (char  *)dest;
	char *s = (char  *)src;
	if (d > s && (s + count) > d) {//src在前且有重叠 从后往前拷贝
		d += count - 1;
		s += count - 1;
		for (size_t i = count - 1; i >= 0; i--){
			*d = *s;
			d--;
			s--;
		}
	}
	else{//没有重叠
		for (size_t j = 0; j < count; j++){//从前往后拷贝
			*d = *s;
			d++;
			s++;
		}
	}
	return dest;
}

void main()
{
	char destin[100] = { 0 };
	char source[] = "hello";
	printf("%sn", mymemmove(destin, source, 3));
	printf("%sn", memmove(destin, source, 3));
}

3.对比截图

如有建议或想法,欢迎一起交流学习~

最后

以上就是故意黑米为你收集整理的C语言——模拟实现memcpy函数和memmove函数的全部内容,希望文章能够帮你解决C语言——模拟实现memcpy函数和memmove函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部