在网上看到一道题,实现一个memcpy函数,于是查了一下memcpy的函数原型,如下:

void* memcpy(char *strDest, const char *strSrc, int Count)
{
if(strDest == NULL || strSrc == NULL || Count <= 0) return NULL;
unsigned char *tempDest;
unsigned char *tempSrc;
tempDest = (unsigned char *)tempDest;
tempSrc = (unsigned char *)tempSrc;
while(Count--)
{
*tempDest = *tempSrc;
tempDest++;
tempSrc++;
}
return strDest;
}

该函数原型实现中并没有考虑两个问题:

1、strDest与strSrc内存覆盖的问题;

2、Count的大小问题,正常的话Count的大小应该满足大于0而小于strSrc指向资源的大小,且小于strDest指向资源的大小。

对于问题1,解决办法如下:

void my_memcpy(void *dst,const void *src,size_t num){
//assert((dst!=NULL) && (src!=NULL) && (num>=0))
if(dst==NULL || src==NULL || num<0)
return;
if(dst==src)
return;
// convert to char type
char* pdst=(char*)dst;
const char* psrc=(const char*)src;
// memory overlap
if(pdst>psrc && pdst<psrc+num){
for(int i=num-1;i>=0;i--)
pdst[i]=psrc[i];
}
else{
for(size_t i=0;i<num;i++)
pdst[i]=psrc[i];
}
}

  

(C语言)memcpy函数原型的实现的更多相关文章

  1. C语言memcpy()函数和memmove()函数

    C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void ...

  2. C语言memcpy函数的用法

    介绍 memcpy是memory copy的缩写,意为内存复制,在写C语言程序的时候,我们常常会用到它.它的函原型如下: void *memcpy(void *dest, const void *sr ...

  3. C语言之memcpy函数

    昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...

  4. C语言函数的声明以及函数原型

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错.但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明.所谓声明(Declaration),就是告诉编译器我 ...

  5. C语言使用memcpy函数实现两个数间任意位置的复制操作

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 用法:void *memcpy(void *dest ...

  6. C语言-内存函数的实现(一)之memcpy

    C语言中的内存函数有如下这些 memcpy memmove memcmp memset 下面看看memcpy函数 memcpy 我们想想,之前有那个字符串拷贝的函数,即strcpy函数.都有拷贝的函数 ...

  7. 《c程序设计语言》读书笔记--子函数原型和声明的形参

    #include <stdio.h> #define Num 20 int power(int base,int n) { int p = 1; int i; for(i = 0;i &l ...

  8. memcpy函数的使用方法

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 1.函数原型 void *memcpy(void * ...

  9. 使用memcpy函数时要注意拷贝数据的长度

    memcpy函数简介 memcpy函数是C/C++语言中的一个用于内存复制的函数,声明在 string.h 中(C++是 cstring).其原型是: void *memcpy(void *desti ...

随机推荐

  1. Codeforces Round #493 (Div 2) (A~E)

    目录 Codeforces 998 A.Balloons B.Cutting C.Convert to Ones D.Roman Digits E.Sky Full of Stars(容斥 计数) C ...

  2. hdu 5251 包围点集最小矩形 ***

    题意:小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. 求个凸包,矩形的边一定在凸包上,枚举边,求最大值,即为所求,多年不拍几何,直接套了 ...

  3. Java并发(二十一):线程池实现原理

    一.总览 线程池类ThreadPoolExecutor的相关类需要先了解: (图片来自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8% ...

  4. codevs 1073 家族 并查集

    家族 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1073/ Description 若某个家族 ...

  5. cocos2d0基础篇笔记一

    1.了解了基本的几个类:Director(导演),Scene(场景),Layer(层),Sprite(精灵): 2.创建精灵: CCSize visiblesize=CCDirector::share ...

  6. SQLite 客户端管理工具

    SQLite 客户端管理工具 SQLite Expert Personal 3.5.79.2499 下载地址:http://www.onlinedown.net/soft/117987.htm SQL ...

  7. C# 标签(条码)的打印与设计(二)

    上一篇说到条码的打印,主要是通过读取模板定义文件(XML文件),然后结合从数据库中读取的动态数据结合而产生条码.下面主要说一下如何设计这个条码模板.设计过程也很简单,只需要简单的拖拉即可.然后点击小箭 ...

  8. C#中,什么时候用yield return

    yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: static Lis ...

  9. Spring-Bean配置-使用外部属性文件(转)

    Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...

  10. x-superobject

    x-superobject GITHUB: https://github.com/onryldz/x-superobject **Delphi Cross Platform Rapid JSON**- ...