自己实现的库函数2(memset,memcmp,memcpy,memmove)
memset,memcmp,memcpy,memmove是对内存进行管理的库函数,为了更好的理解和使用这几个函数,自己用C语言实现一下~
//内存设置函数
void* my_memset(void* dest, int c, size_t count)
{
assert(dest != NULL);
char* pDest = (char*)dest;
while (count-->0) //将内存中count个设置为c
{
*pDest++ = c;
}
return dest;
}
//内存比较函数
int my_memcmp(void* src1, void* src2, int len)
{
assert(src1 != NULL && src2 != NULL);
const char* pSrc1 = (char*)src1;
const char* pSrc2 = (char*)src2;
while (len-- > 0)
{
if (*pSrc1++ != *pSrc2++) //当内存中的数据不相等时,可以比较出大小,否则两指针继续向后指
{
return *pSrc1 < *pSrc2 ? -1 : 1;
}
}
return 0; //相等则返回0
} 要重点说一下内坤拷贝和内存移动函数。。。
memmove与memcpy都是将count个字节的源内存地址的内容拷贝到目标内存地址中,但当源内存和目的内存存在重叠时,memcpy会出现错误!memmove能正确拷贝,但也增加了一点点开销。
//内存拷贝函数
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (const char*)src;
while (count-- > 0)
{
*pDest++ = *pSrc++; //将pSrc指向的数据复制count个给pDest
}
return dest;
}
//内存移动函数
void* my_memmove(void* dest, void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (char*)src;
if (pSrc >= pDest || pDest >= (pSrc + count))//当源内存地址在目的内存地址之后或者目的地址在源内存地址+count之后,可以正常拷贝
{

while (count-- > 0)
{
*pDest++ = *pSrc;
}
}
else //否则需要从后覆盖往前拷贝,防止出现覆盖
{
while (count-- > 0)

{
*(pDest + count) = *(pSrc + count);
}
}
*pDest = '\0';
return dest;
}
自己实现的库函数2(memset,memcmp,memcpy,memmove)的更多相关文章
- memset memcmp memcpy memmove 自己实现
memset memcmp memcpy memmove 自己实现 memset #include <stdio.h> #include <memory.h> #include ...
- 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()
1.memset()内存设置函数(初始化) void *my_memset(void* dest, int c, size_t count) { assert(dest != NULL); char ...
- 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...
- <cstring>中常用的两个函数memset()和memcpy()
<cstring>是c++对c中的<string.h>进行了重写,这两个头文件中的函数用法是一样的,所以在用的时候包含哪个头文件都行.下面介绍一下 <cstring> ...
- memcpy/memmove?快速乘?
memcpy?memmove? //#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; ; ],b[n ...
- c语言中几个常见的库函数strlen、strcmp、strcat、strcpy、strncpy、memset、memcpy、memmove、mmap
1.strlen() 1)计算给定字符串的长度,不包括’\0’在内 unsigned int strlen(const char *s) { assert(NULL != s);//如果条件不满足,则 ...
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- memset,memcpy,memmove,strcpy,strcat,strcmp的实现(其实很简单,每个程序都只有几行代码)
面试中的几个小问题 1.对stl中list封装(参考1): 2.对重要C函数实现(参考2): //memset void *memset(void *buffer, int c, int count) ...
- memset和memcpy函数、atoi函数
memset void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c.如下: // 1.将已开辟内存空间s的首n个字节 ...
随机推荐
- 批处理:循环解压不同文件夹下的zip压缩包
结构如下 A文件夹: A1文件.zip A2文件.zip A3文件.zip B文件夹: B1文件.zip B2文件.zip B3文件.zip ...... 批处理文件:rezip.bat如下 @ech ...
- careercup-树与图 4.7
4.7 设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先.不得将额外的结点储存在另外的数据结构中.注意:这不一定是二叉查找树. 解答 本题的关键应当是在Avoid storing addit ...
- 文件和目录之mkdir和rmdir函数
用mkdir函数创建目录,用rmdir函数删除目录. #include <sys/stat.h> int mkdir( const char *pathname, mode_t mode ...
- [转]BeagleBone Black USB一线通(2)
接上篇 BeagleBone Black USB 一线通(1) 三.网络与ssh终端 通过串口终端我们可以看到启动的过程,也能做一些交互操作,比如我们看到了网络接口的状况.其中的usb0已经在随板的 ...
- Java并发——ReentrantLock类源码阅读
ReentrantLock内部由Sync类实例实现. Sync类定义于ReentrantLock内部. Sync继承于AbstractQueuedSynchronizer. AbstractQueue ...
- Objective-c中的设计模式
如果你会写算法,又理解设计模式,你就牛逼了.后面一段时间我会尽可能易懂的描述来讲解iOS中的设计模式,并且每个设计模式都会有对应的demo:https://github.com/goodyboy6/D ...
- PHP 概述 特点 基础语法
PHP是什么 http://php.net/manual/zh/intro-whatis.php#intro-whatis PHP(Hypertext Preprocessor,超文本预处理器)是一 ...
- WPF 皮肤之MathApps.Metro UI库
在WPF中要想使用Metro风格是很简单的,可以自己画嘛.. 但是为了节省时间,哈,今天给大家推荐一款国外Metro风格的控件库. 本文只起到抛砖引玉的作用,有兴趣还是推荐大家上官网,Thanks,官 ...
- 20160501--struts2入门2
一.Action名称的搜索顺序 1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action 2.首先寻找name ...
- 使用XMl序列化器生成xml文件
生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...