【内存操作函数】
字符串操作函数中有一个strcpy的函数,它可以拷贝字符类型,那么有没有不关心类型的函数呢?这个,当然是有滴,大师们早就将他们写到库里面了,
自写内存操作函数
。1.memcpy() 用来复制内存,其原型为:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。
memcpy() 并不关心被复制的数据类型,也就是说它可以操作任意类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。
需要注意的是:
>>1.dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
>>2.dest 和 src 所指的内存空间不能重叠(如果发生了重叠,使用 memmove()会更加安全)。
与 strcpy() 不同的是,memcpy() 会完整的复制 num 个字节,不会因为遇到“\0”而结束。
【返回值】返回指向 dest 的指针。注意返回的指针类型是 void,使用时一般要进行强制类型转换。
【函数实现】
#include <stdio.h>#include <string.h>#define MAX 20void* my_memcpy(void *dest,const void *src,size_t count){ int *buf1=(int *)dest; int *buf2=(int *)src; int *pret=(int *)dest; while (count--) { *buf1=*buf2; buf1++; buf2++; } return pret;}int main(){ int arr[MAX]={0}; int brr[5]={1,2,3,4,5}; int size=sizeof(brr)/sizeof(brr[0]); int i=0; my_memcpy(arr,brr,size); for (i=0;i<MAX;i++) { printf("%d ",arr[i]); } printf("\n"); return 0;}
结果:
这个就将原数组中的0一个不漏的打印出来了,好神奇_^_^_
有了这个函数,就解决了一部分拷贝的问题,为什么说一部分呢,接下来,听我慢慢道来,
电脑资料
《自写内存操作函数》(https://www.unjs.com)。这个时候,我有一个问题,如果我给定一个数组arr[10]={1,2,3,4,5,6,7,8,9,10};我想把它的{5,6,7,8}拷贝到{7,8,9,10}上去最后打印出数组arr结果应该是{1,2,3,4,5,6,5,6,7,8};接下来看代码实现:
#include <stdio.h>void* my_memcpy(void *dest,const void *src,size_t count){ int *buf1=(int *)dest; int *buf2=(int *)src; int *p=(int *)dest; while (count--) { *buf1=*buf2; buf1++; buf2++; } return p;}int main(){ int arr[10]={1,2,3,4,5,6,7,8,9,10}; int i=0; my_memcpy(arr+6,arr+4,16); for (i=0;i<10;i++) { printf("%d ",arr[i]); } printf("\n"); return 0;}
结果:
这个结果怎么和预先预测的结果不一样呢_~~_这就是出现上面注意的第二点dest 和 src 所指的内存空间不能重叠,如果出现重叠,就会出现想不到的问题。