模拟实现memset,memcpy,memmove函数

xiaoxiao2021-02-28  160

         模拟实现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; }

运行结果如下:

 

 

转载请注明原文地址: https://www.6miu.com/read-23184.html

最新回复(0)