memcpy,strcpy,memset,memmove的函数实现
来源:互联网 发布:光钎网络监控安装教程 编辑:程序博客网 时间:2024/04/30 03:00
【转】memcpy,strcpy,memset,memmove的函数实现
/**********************************************************
公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出)各种情况包括:1、参数是指针,检查指针是否有效2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出3、读写权限检查4、安全检查,是否会溢出
**********************************************************/
/* 功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。*/
void* memcpy(void* dst,const void* src,size_t count)
{
char* pbTo = (char*)dst;
char* pbFrom = (char*)src;
assert(dst!= NULL && src != NULL);//不能存在空指针
assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止内存重叠(overlap)
while (count-- > 0)
{
*pbTo++ = *pbFrom++;
}
return dst;
}
/* 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指
内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。*/
char* strcpy(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
char* address=dest;
while((*dest++=*src++) != '\0')
{}
return address;
}
/* 功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。*/
void* memset(void* buffer, int c, int count)
{
char* pvTo=(char*)buffer;
assert(buffer != NULL);
while(count-->0)
{
*pvTo++=(char)c;
}
return buffer;
}
/*
memmove自定义函数
*/
//src可以不保留
void* memmove(void* dst,const void* src,size_t count)
{
char* pbTo = (char*)dst;
char* pbFrom = (char*)src;
assert(dst != NULL && src != NULL);//不能存在空指针
if (dst <= src || pbTo >= pbFrom + count)//没有overlap的情况,直接拷贝
{
while (count-- > 0)
{
*pbTo++ = *pbFrom++;
}
}
else
{
pbTo = pbTo + count -1;//overlap的情况,从高位地址向低位拷贝
pbFrom = pbFrom + count -1;
while (count-- > 0)
{
*pbTo-- = *pbFrom--;
}
}
return dst;
}
- memcpy,strcpy,memset,memmove的函数实现
- 函数实现-memcpy-strcpy-memmove-memset
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- [转]strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- strcpy()、memcpy()、memmove()、memset()的实现
- UVa 12291 Polyomino Composer
- 【菜鸟C++学习笔记】25.函数重载
- php实现伪静态的方法
- cocos2d-x 删除CCSprite时崩溃 glDeleteTextures(1, &m_uName); // CRASH !!!
- 谈一下我学习栈的时候一点点心得
- memcpy,strcpy,memset,memmove的函数实现
- 根据地址的经纬度查询周围的城市
- Android mk文件介绍
- 基于tabbarController中的每个tabbar都是UINavigation的涉及到的登陆、注销情况
- QQ空间伤感日志_其实放手不是不爱你
- 如何走出JavaScript初学困境
- Windows核心编程学习笔记(13)--浅谈线程上下文
- 继续写文章
- 如何扩大二维数组的大小(任何类型的通用版)