内从拷贝函数可以拷贝任意内容,拷贝的个数以字节为单位,无类型
【memcpy函数】
原型:void *memcpy( void *dest, const void *src, size_t count );
头文件:<memory.h> or <string.h>
模拟实现memcpy函数:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> void *my_memcpy(void *dst, const void *src, int count) { assert(dst); assert(src); char *d = (char *)dst; char *s = (char *)src; while (count--) { *d = *s; d++; s++; } return dst; } int main() { //拷贝字符串 //const char *str = "abcdef"; //char dst[32] = { 0 }; //my_memcpy(dst, str, strlen(str)+1); //printf("%s\n", dst); //拷贝数组 const int arr1[] = { 1, 2, 3, 4, 5, 6 }; int arr2[10] = { 0 }; my_memcpy(arr2, arr1, sizeof(arr1));//调试监视观察 system("pause"); return 0; }
但是,看下面一段代码第一个调用函数不会出现我们所期望的aabcdef而是出现了aaaaaaa.....
void *my_memcpy(void *dst, const void *src, int count) { assert(dst); assert(src); char *d = (char *)dst; char *s = (char *)src; while (count--) { *d = *s; d++; s++; } return dst; } int main() { char str[] = "abcdef"; //my_memcpy(str+1, str, strlen(str)+1);//输出aaaaa...... my_memcpy(str, str+1, strlen(str) + 1);//输出bcdef printf("%s\n", str); system("pause"); return 0; }
为什么会出现这种情况,内从重叠。
下图是内从关系,主要考虑第三种。
【memmove函数】
考虑第三种情况,专门处理第三种的函数是memmove
代码如下:
void *my_memmove(void *dst, void *src, int count) { assert(dst); assert(src); char *d = (char *)dst; char *s = (char *)src; if (d > s && d < s + count)//从右往左 { s = s + count - 1; d = d + count - 1; while (count--) { *d = *s; d--; s--; } } else { while (count--) { *d = *s; d++; s++; } } return dst; } int main() { char str[] = "abcdef"; my_memmove(str+1, str, strlen(str)+1);//输出aabcdef //my_memcpy(str, str+1, strlen(str) + 1);//输出bcdef printf("%s\n", str); system("pause"); return 0; }
【memset函数】
最终结果出来 16843009 即按字节初始化1000000010000000100000001