常考的函数有下面三个,memset,memcpy,memmove,一定要记住三个函数的函数原型,熟记返回值类型和参数类型,当然也不能忘记参数检查
- memset
1 #include2 #include 3 using namespace std; 4 5 void *my_memset(void *s, int ch, size_t n) 6 { 7 assert(s); 8 char *ptr = (char *)s; 9 for (size_t i = 0; i < n; ++i)10 {11 *(ptr++) = ch;12 }13 return s;14 }15 16 17 int main()18 {19 char s[10];20 my_memset(s,'a',10);21 return 0;22 }
一定要先把void*的指针强制转化成char *再进行操作,不然拿void*是没办法的
- memcpy
1 #include2 using namespace std; 3 4 void *my_memcpy(void *dest, void *src, size_t n) 5 { 6 assert(dest && src); 7 char *pdest = (char *)dest; 8 char *psrc = (char *)src; 9 for (size_t i = 0; i < n; ++i)10 {11 *(pdest++) = *(psrc++);12 }13 return dest;14 }15 16 int main()17 {18 return 0;19 }
memcpy是没有考虑内存覆盖问题的,所以在进行自身拷贝的时候推荐使用memmove,VS2015的memcpy好像已经结局内存覆盖的问题了,但是为了跨平台的安全考虑,使用memmove是绝对没问题的
- memmove
1 #include2 #include 3 using namespace std; 4 5 6 void *my_memcpy(void *dest, void *src, size_t n) 7 { 8 assert(dest && src); 9 char *pdest = (char *)dest;10 char *psrc = (char *)src;11 for (size_t i = 0; i < n; ++i)12 {13 *(pdest++) = *(psrc++);14 }15 return dest;16 }17 void *my_memmove(void *dest, void *src, size_t count)18 {19 assert(dest && src);20 char *pdest = (char *)dest;21 char *psrc = (char *)src;22 if (psrc + count > pdest && pdst > psrc)//之前是这样的psrc + count > pdest,条件不完全,虽然没啥错就是了23 {24 for (int i = count - 1; i >= 0; i--)25 {26 *(pdest + i) = *(psrc + i);27 }28 }29 else30 {31 for (int i = 0; i < count; ++i)32 {33 *(pdest + i) = *(psrc + i);34 }35 }36 return dest;37 }38 39 40 41 int main()42 {43 char s1[] = "hello world";44 char s2[] = "hello world";45 my_memmove(s1+3,s1,6);46 my_memcpy(s2+3, s2 , 6);47 return 0;48 }