面试基础(二)-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 }