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;
}