zoukankan      html  css  js  c++  java
  • 面试基础(二)-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 }
  • 相关阅读:
    Linux ps命令
    SecureCRT注册机使用方法
    微信消息的处理和应答
    微信公众号开发--开发服务器接入微信服务器
    RESTful架构
    OAuth2.0详解
    HTTP头详解
    Cookie/Session机制详解
    学习tornado:安全
    python tornado框架实现CRUD
  • 原文地址:https://www.cnblogs.com/lenomirei/p/5460601.html
Copyright © 2011-2022 走看看