内存拷贝的实现.c
2017-01-05 23:04
225 查看
/*memcpy函数的实现 *memcpy是内核提供的机制,应用C编写(linux内核由C编写) *strcpy只提供字符串的拷贝,memcpy可以实现任意类型的拷贝 */
# include <stdio.h># include <stdlib.h>
void* Memcpy(void *dst, const void *src, int len) //destination 目的 source 源 length 长度 该长度按字节算,一个int为len = 4 { char *psrc; char *pdst; if(dst == NULL || src == NULL || len == 0) //dst需提前申请内存 { printf("内存错误!\n"); return NULL; } if((src < dst) && (char *)src + len > (char *)dst) //判断内存空间是否重叠,src<det,即src在前,src+len>dst即有重叠(src与dst必须以字节为单位) { printf("\033[31m001 \033[0m"); psrc = (char *)src + len - 1; //psrc指向src的末尾 pdst = (char *)dst + len - 1; while(len--) { *pdst-- = *psrc--; //从后向前复制 } } else { printf("\033[32m002 \033[0m"); psrc = (char *)src;//psrc指向src的起始位 pdst = (char *)dst; while(len--) { *pdst++ = *psrc++;//从前向后复制 } } return dst;}void show(int* arrary,int n){ for (int i = 0;i<n;i++){ printf("%d ", arrary[i]); } printf("\n");}int main(){ char buf1[100] = "abcdefghijk"; char buf2[20] = {'\0',}; Memcpy(buf2, buf1, 5); printf("buf2 : %s\n", buf2);
int buf3[10] = {9,8,7,6,5,4,3,2,1,0}; int* buf4 = (int*)malloc(sizeof(int[10])); int* buf5 = (int*)malloc(sizeof(int[5])); int buf6[20] = {0,}; Memcpy(buf4, buf3, 40); printf("buf4 : "); show(buf4,10); Memcpy(buf5, buf3, 20); printf("buf5 : "); show(buf4,5); free(buf4); free(buf5); Memcpy(buf6, buf3, 40); printf("buf6 : "); show(buf6,10); Memcpy(buf6+4,buf6,40); printf("buf7 : "); show(buf6,10); return 0;}
# include <stdio.h># include <stdlib.h>
void* Memcpy(void *dst, const void *src, int len) //destination 目的 source 源 length 长度 该长度按字节算,一个int为len = 4 { char *psrc; char *pdst; if(dst == NULL || src == NULL || len == 0) //dst需提前申请内存 { printf("内存错误!\n"); return NULL; } if((src < dst) && (char *)src + len > (char *)dst) //判断内存空间是否重叠,src<det,即src在前,src+len>dst即有重叠(src与dst必须以字节为单位) { printf("\033[31m001 \033[0m"); psrc = (char *)src + len - 1; //psrc指向src的末尾 pdst = (char *)dst + len - 1; while(len--) { *pdst-- = *psrc--; //从后向前复制 } } else { printf("\033[32m002 \033[0m"); psrc = (char *)src;//psrc指向src的起始位 pdst = (char *)dst; while(len--) { *pdst++ = *psrc++;//从前向后复制 } } return dst;}void show(int* arrary,int n){ for (int i = 0;i<n;i++){ printf("%d ", arrary[i]); } printf("\n");}int main(){ char buf1[100] = "abcdefghijk"; char buf2[20] = {'\0',}; Memcpy(buf2, buf1, 5); printf("buf2 : %s\n", buf2);
int buf3[10] = {9,8,7,6,5,4,3,2,1,0}; int* buf4 = (int*)malloc(sizeof(int[10])); int* buf5 = (int*)malloc(sizeof(int[5])); int buf6[20] = {0,}; Memcpy(buf4, buf3, 40); printf("buf4 : "); show(buf4,10); Memcpy(buf5, buf3, 20); printf("buf5 : "); show(buf4,5); free(buf4); free(buf5); Memcpy(buf6, buf3, 40); printf("buf6 : "); show(buf6,10); Memcpy(buf6+4,buf6,40); printf("buf7 : "); show(buf6,10); return 0;}
相关文章推荐
- Protocol Buffers 中实现 ZeroCopyStream 来减少内存拷贝
- c语言内存管理函数,模拟memcpy、memmove(实现内存重叠拷贝)、memset
- 几个典型的内存拷贝及字符串函数实现
- 几个典型的内存拷贝及字符串函数实现
- 几个典型的内存拷贝及字符串函数实现
- 内存拷贝实现
- C语言如何调用 memcpy 函数 实现内存拷贝
- 内存拷贝实现
- 编写一个memmove函数,实现内存拷贝
- 几个典型的内存拷贝及字符串函数实现
- C语言中字符串拷贝(strcpy)与内存拷贝(memcpy)的实现
- 几个典型的内存拷贝及字符串函数实现
- C语言 编写程序实现内存拷贝,不考虑内存重叠。不允许调用memcpy函数
- 内存拷贝,实现程序自身代码复制。
- C语言 编写函数实现内存重叠拷贝,不允许调用memmove函数
- 几个典型的内存拷贝及字符串函数实现
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- 不用标准库实现memmove,借助一个缓冲区temp,即使src和dest所指的内存有重叠也能正确拷贝
- 2006.9.9 实现定时拷贝屏幕,并保存为指定目录下形成文件DeleteObject(hBmp);//必须要添加,否则会占用内存,越来越小,一定要注意
- [置顶] 实现内存的移动,功能类似于memmove,可以不实现内存重叠拷贝,不使用任何库函数