实现memcpy函数

1、描述

实现函数

memcpy(void *dst, const void * src, size_t n){

}

4、notes

1、dst和src都得是有效指针,这个函数才有意义。
2、assert 后面的语句为真,才往后执行,如果为假,就直接终止程序,

两外两个题:
第一题:马走日,给定最起终点,求最少步数到达
第二题:红黄蓝一行涂色问题

6、code

瑕疵版本:可能会内存重叠,

void* memcpy(void * dst, const void * src,size_t n){
	//assert((dst != nullptr) && ( src != nullptr));  // assert 后面的语句为真,才往后执行,
	if(dst == nullptr || src == nullptr) return;  // 任意一个为空都不行,
	const char* psrc = (const char *) src;// 因为void*无法完成“++”,“--”操作
	char * pdst = (char*) dst;
	while(n--){
		*pdst++ = *psrc++;
	}
	return dst;
}

完善代码:

void * memcpy(void * dst, const void * src, size_t n){
	if(src == nullptr || dst == nullptr) return nullptr;

	const char* psrc = (const void *) src;
	char * pdst = (char *) dst;

	if (psrc < pdst&& psrc + n > pdst){  // 如果有重叠,src在前边,从后往前
		for ( size_t i = n - 1; i >= 0 && i < n; --i){
			pdst[i] = psrc[i];   // 不用i++
		}
	}
	else{ // 没有重叠,或者dst在前边,直接从前往后拷贝,
		for(size_t i = 0; i < n; i++){
			pdst[i] = psrc[i];
		}
	};
	return dst;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值