void * memcpy ( void * destination, const void * source, size_t num) ;
\0
的时候并不会停下来int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 0 };
memcpy(arr2,arr1,20);
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", arr2[i]);
}
拷贝arr1前5个数到arr2里
void* my_memcpy(void * dest,const void * src,size_t num) {
void* ret = dest;
assert(dest);
assert(src);
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
void * momove ( void* destination , cosnt void* source , size_t num) ;
先看下面的代码
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 0 };
my_memcpy(arr1+3,arr1,20);
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", arr1[i]);
}
上面是想从arr1+3,也就是从4开始的位置,复制5个数据,也就是1,2,3,1,2,3,4,5,9,10。但最后的结果却不是这样的,原因就是当到重叠的位置时,数据已经被之前复制的覆盖过了,源数据已经被改变,所以出现错误
输出:
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 0 };
memmove(arr1+3,arr1,20);
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", arr1[i]);
}
输出:
对于一般的情况,我们直接拷贝数据就行,和memcpy一样。当数据有重叠时,可以分为三种情况
第一种,目标地址desc在源空间src的左边
第二种,目标地址desc在src+num中间,这种情况从前向后拷贝时原值会被替换,所以要从后往前拷贝
第三种,目标地址在src的右边,这个时候从左到右拷贝或从右到左都行
void* my_memmove(void * dest,const void * src,size_t num) {
assert(dest);
assert(src);
void* ret = dest;
//从前往后拷
if (dest < src || (char*)dest >= ((char*)src+num)) {
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
//从后往前拷
else {
dest = (char*)dest + num - 1;
src = (char*)src + num - 1;
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}
void * memeset ( void * ptr, int value , size_t num) ;
memeset是用来设置内存的,将内存中的值以字节为单位设置为想要的内
char str[] = "hello world";
memset(str,'x',6);
printf(str);
将字符串的前6个字符改为x
int memcmp ( cosnt void * ptr1, const void * ptr2, size_t num) ;
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGaOtP12df0";
int n;
n = memcmp(buffer1,buffer2,sizeof(buffer1));
printf("%d ", n);
上面的两个字符串,其中g小写和大写,由于小写的值更大,所以会返回大于0的数