模拟实现memset,memcpy,memmove函数
来源:互联网 发布:淘宝商家管理系统 编辑:程序博客网 时间:2024/05/16 15:24
模拟实现memset,memcpy,memmove函数
memset
功能是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。memset的作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
模拟实现代码如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>void* my_memset(void* buf, int set, int sz){int i = 0;for (i = 0; i < sz; i++){*((char*)buf + i) = set;}return buf;}int main(){char buf[5];int i = 0;my_memset(buf, 0, 5);for (i = 0; i < 5; i++){printf("%s\n", buf[i]);}system("pause");return 0;}
运行结果如下:
memcpy
memcpy的函数原型是void *memcpy(void *dest, const void *src,size_t n),其功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
模拟代码如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>void* my_memcpy(void* dest, const void* src, int count){assert(dest != NULL);assert(src != NULL);char *pdest = (char*)dest;char *psrc = (char*)src;int i = 0;for (i = 0; i < count; i++){*pdest++ = *psrc++;}return dest;}int main(){char buf[] = "i love world";char arr[20];int i = 0;my_memcpy(arr, buf, 13);printf("%s\n", arr);system("pause");return 0;}
运行结果如下:
memmove
用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。由src所指内存区域复制count个字节到dest所指内存区域。
因此在模拟实现的时候,我们要考虑从前向后拷贝还是从后向前拷贝,举个简单的例子具体分析:
模拟实现代码如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>void* my_memmove(void* dest, const void* src, int count){assert(dest != NULL);assert(src != NULL);char *pdest = (char*)dest;char *psrc = (char*)src;int i = 0;if (dest < src){for (i = 0; i < count; i++){*pdest++ = *psrc++;}}else{while (count--){*(pdest+count) = *(psrc+count);}}return dest;}int main(){int buf[] = { 2, 3, 4, 5, };int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };int i = 0;my_memmove(arr, buf, 16); //16个字节相当于4个整型for (i = 0; i < 10; i++){printf("%d", arr[i]);}printf("\n");system("pause");return 0;}
运行结果如下:
阅读全文
0 0
- 模拟实现memset,memcpy,memmove函数
- 模拟实现memcpy/memmove/memset
- 模拟实现memcpy,memmove,memset
- 模拟实现memcpy,memmove,memset
- C语言模拟实现memcpy、memmove、memset
- memcpy,strcpy,memset,memmove的函数实现
- 函数实现-memcpy-strcpy-memmove-memset
- 模拟实现memcpy memmove 函数
- 模拟实现 memcpy memmove 函数
- c语言内存管理函数,模拟memcpy、memmove(实现内存重叠拷贝)、memset
- memset和memcpy、memmove实现
- C语言模拟实现memcpy,memmove函数
- 模拟实现memcpy和memmove函数
- 【c语言】模拟实现memcpy()、memmove()函数
- 模拟实现memcpy和memmove函数
- 模拟实现内存操作函数memcpy、memmove
- 内存操作函数memmove,memcpy,memset
- strcpy()、memcpy()、memmove()、memset()的实现
- XMLHTTP中setRequestHeader方法和参数
- 调用newtonsoft.json反序列出错
- .net(c#)提取多层嵌套的JSON
- Js 正则表达式匹配字符串中是否含有中文
- [转帖]VS选中某个代码报错修补
- 模拟实现memset,memcpy,memmove函数
- SQL存储过程的调用及写法
- 服务器重启后网站可以打开,一会网站就打不开
- SQL 2008 windows登录失败,错误18456, 更正
- 关于vs调试正确。但是发布到iis就出现无法访问后天局面
- --------------------------------新博《大城小爱》分界线------------------------------------
- SRM553 Div1Medium TwoConvexShapes
- 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
- SQL2012连接字符串