面试基础(二)-mem函数

常考的函数有下面三个,memset,memcpy,memmove,一定要记住三个函数的函数原型,熟记返回值类型和参数类型,当然也不能忘记参数检查

 

  • memset
 1 #include<iostream>
 2 #include<cassert>
 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 #include<cassert>
 2 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 #include<iostream>
 2 #include<cassert>
 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     else
30     {
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 }

 

posted @ 2016-05-05 09:31  leno米雷  阅读(473)  评论(0编辑  收藏  举报