C 語言 記憶體操作篇

來源:互聯網
上載者:User
C 語言記憶體操作篇

 

         關於這個系列的函數有一個特點就是是要注意記憶體二字,記憶體是不區分大小的,即沒有資料類型之說,只有位元組這個單位,而char 類型正好是一個位元組,所以可以將其強制轉換成char類型。雖然有很多函數類似字串函數,但是千萬不要取其等同對待。記憶體是不管是否有結束標誌'\0'的。,,,,還有就是每個函數都有size_t n;

 

1  int memcmp(const void* s1,const void* s2,size_t n)  s1中的每個位元組與s2中的位元組比較

千萬要注意size_t n 表示的是位元組數。

如:int i = -1,j = 255;memcmp(&i,&j,1);  這個傳回值是0。memcmp(&i,&j,2) 返回-1

int memcmp(const void *s1,cont void* s2,size_t n)
{

      assert(s1 != NULL && s2 != NULL);
      int temp = 0;
      char* str1 = (char*)s1;//最好顯示的寫出強制類型轉換
      char* str2 = (char*)s2;

       //記得n--要放在前面相當於for(;n--;)迴圈中的判斷條件

      //如果放在後面就起不到作用了
      while(n-- && (temp = (*str1++ - *str2++) == 0));


      return temp;
}

 

2   void* memcpy(void* dest,const void* src,size_t n)  這裡的memcpy要與strcpy區別對待。多了一個位元組數的參數而且如果是對字元操作的話小心最後'\0'

 

void* memcpy(void* dest,const void* src,size_t n)

{

       assert(dest != NULL && src != NULL);

       char* ch1 = (char*)dest;

       const char* ch2 = (char*)src;

 

       while(n-- && (*ch1++ = *ch2++));//記得加(),優先順序要注意

 

       return dest;

}

3 void* memmove(void* dest,const void* src,size_t n) 這個與memcpy差別就在於對記憶體重疊的處理,如果dest 地址在前面,那麼就正常的賦值,如果在後面.則從後往前賦值.

功能上看得話完全可以用memmove代替memcpy

 

void* memmove(void* dest,const void* src,size_t n)

{

     assert(dest != NULL && src != NULL);

     char* pdest = (char*)dest;

     char* psrc = (char*)src;

 

      if(pdest < psrc)

                 while(n-- && (*dest++ = *src++));

      else

                while(n-- && (*(dest + n - 1) = *(src + n - 1)));

 

      return dest;

}

 

3 void* memccpy(void* dest,const void* src,int c,size_t n) 這個函數實現的時候要非常的小心。這個函數的傳回值是指定的c的下一個地址,而且這個地址是可以解引用的。目的應該是方便賦值'\0'.於是乎就不能寫成

 

       while(n-- && *pdest != (char)c && (*pdest++ = *psrc++));

       return *pdest == (char)c ? (pdest + 1) : NULL;

 

void* memccpy(void* dest,const void* src,int c,size_t n)

{

       assert(dest != NULL && src != NULL);

       char* pdest = (char*)dest;

       char* psrc = (char*)src;

 

       while(n-- && (*pdest++ = *psrc++) && *(pdest - 1) != (char)c);

 

       return *(pdest - 1) == (char)c ? pdest : NULL;

}

 

4  void* memset(void* s,int c,size_t n);

 

void* memset(void* s,int c,size_t n)

{

      assert(s != NULL);

      char* p = (char*)s;

 

      while(n-- && (*s++ = (char)c));

 

      return p;

}

 

5 void bzero(void* s,size_t n)

 

void bzero(void* s,size_t n)

{

      memset(s,0,n);

}

 

6 void* memchr(const void* s,int c,size_t n)

 

void* memchr(const void* s,int c,size_t n)

{

      assert(s != NULL);

      char* p = (char*)s;

 

      while(n-- && *p++ != (char)c);

 

      return *--p == (char)c ? p : NULL;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.