天天看點

memset和memcpy函數

memset函數

原型:

void *memset(void *s, int ch, size_t n);

作用:将s所指向的記憶體中的前n個位元組的内容全部設定為ch指定的ASCII值,這個函數通常為新申請的記憶體做初始化工作。一般用于結構體和數組的初始化。

  1. memset中的第三個參數一定要使用sizeof操作符,因為每個系統下對類型長度的定義可能不一樣。
  2. memset中的第一個參數一定要是一個已知的、已經被配置設定記憶體的位址,否則會出錯。
  3. 對于單位元組資料類型(char)可以初始化為任意支援的值,都沒有問題,但是對于非多位元組資料類型隻能初始化為0,而不能初始化成别的初值,否則容易出錯。

memset的效率很高,比手動指派要高的多,比bzero也要高,尤其大數組的情況。

我是這樣實作的:

void* _memset(void* dst,int val, size_t count)
{
    assert(dst!=NULL);
    char* tmpdst = (char*)dst;
    while(count--)
    {
        *tmpdst = (char)val;
        tmpdst++;
    }
    return dst;
}
           

memcpy函數

memcpy函數的使用場合是不需要考慮記憶體重疊問題的,因為涉及到記憶體重疊時我們應該調用的是memmove函數。我是這樣實作的:

void* _memcpy(void* dst, const void* src, size_t n)
{
    assert(dst!=NULL && src!=NULL);
    assert(n>=);
    char* temp = (char*)dst;
    const char* p = (char*)src;
    size_t m=; //void指針不能自增
    while(n--)
    {
        *temp = *p;
        temp++;
        p++;
    }
    return dst;
}
           

memmove進行了改進,考慮了記憶體重疊的情況:

void* my_memmove(void* dst, const void* src, size_t n)
{
    char* s_dst;
    char* s_src;
    s_dst = (char*)dst;
    s_src = (char*)src;
    if(s_dst>s_src && (s_src+n>s_dst)) {
        s_dst = s_dst+n-;
        s_src = s_src+n-;
        while(n--) {
            *s_dst-- = *s_src--;
        }
    }else {
        while(n--) {
            *s_dst++ = *s_src++;
        }
    }
    return dst;
}
           
c++

繼續閱讀