strerror,memcpy和memmove的原理和实现

文章介绍了C语言中处理错误的方法,如通过strerror函数将错误码转换为错误信息。同时,讨论了memcpy和memmove函数在内存拷贝中的应用,包括memcpy的通用性以及memmove在处理内存重叠时的优势。my_memcpy和my_memmove的实现展示了如何处理不同的拷贝情况。
摘要由CSDN通过智能技术生成

strerror

//函数声明
char*strerror(int errnum);
//返回错误码所对应的错误信息

c语言的库函数在调用失败的时候,会将一个错误代码存放在一个叫 errno 的变量中

当我们想知道调用库函数的时候发生了什么错误信息,就可以将errno的错误码翻译成错误信息。

FILE*pf=fopen("test,txt","r");
if(pf==NULL)
{
  printf("打开文件失败,原因啊:%s\n",strerror(errno));//把错误码翻译成错误信息
  return 1;
}

注意:

重复调用库函数并且出错,errno的错误码会被更新。

memcpy内存拷贝函数

相比于strcpy memcpy可以复制任意类型的数据而只是拷贝字符串

void*memcpy(void*destination,const void*source,size_t num);//函数声明
//void*--通用类型的指针,可以接受任意类型的数据的地址

 

memcpy函数的设计者不知道未来程序员使用memcpy拷贝什么类型的数据,所有用void*

//my_memcpy
//返回目标空间的起始地址

void* my_memcpy(void*dest,const void*src,size_t num)
{
  void ret=dest;
  while(num--)
{

  *(char*)dest=*(char*)src;//如果是int或其他可能无法满足拷贝要求
   dest=(char*)dest+1;
   src=(char*)src+1;
}
  return ret;

}

 注意:在dest和src可能共用同一块内存的情况下即在内存重叠的情况下,使用memcpy可能达到想不到的效果。这个时候就需要使用memmove

memmove

void*memmove(void*destination,const void*source,size_t num);//函数声明

memmove可以分成两种情况进行拷贝,即从前往后拷贝和从后往前拷贝。

从前往后拷贝的情况:

将3 4 5 6 7 拷贝到1 2 3 4 5 中。我们预期得到的是3 4 5 6 7 6 7 8 9 10。如果从后往前拷贝将会被覆盖从而得到 6 7 7 6 7 6 7 8 9 10,这个时候就需要从前往后拷贝。

从后往前拷贝的情况:

将1 2 3 4 5 拷贝到3 4 5 6 7中。同理,若从前往后拷贝会存在被覆盖的现象。因此我们选用从后往前拷贝。

 找规律可知:当dest落到src左边的时候应该从前向后拷贝,当dest落到src右边的时候从后往前拷贝,当两块区域没有交叉的时候两种拷贝方式都可以。

综上所述:

 

 

if(dest<src)
{
   //前->后;
}
else 
{
   //后->前;
}
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	if (dest < src)
	{
		//前->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值