程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言- 字符串的內存拷貝處理函數

C語言- 字符串的內存拷貝處理函數

編輯:關於C語言

C語言- 字符串的內存拷貝處理函數


對於字符串來說,我們運用字符串<string.h>中的str類別的函數,但是我們還有一些關於內存的拷貝函數。他們操作的對象是內存,然後可以接受任何類型的數據進行拷貝。     這個是<memory.h>裡面的memcpy,然後我們一起查看一下MSDN看一看他的原型:     void *memcpy(void *dest,const void *src,size_t count);     與strcpy不同的就是添加了第三個參數,確定操作的字節數,然後參數類型還有返回類型都是void* ,這表示他可以拷貝任意類型的數據。     然後我們看一下實現:     memcpy:    
void *my_memcpy(void *str,const void *Dstr,int count)                      
   //從內存地址開始改變,並確定改變長度,所以用萬能類型去接受
{
             char *pstr = (char *)str;
             char *pDstr = (char *)Dstr;
            assert((str!=NULL) && (Dstr != NULL));
             if(str == Dstr)                            
             //位置相同情況下直接返回需要改變的
                         return (char *)Dstr;
             while(count-- > 0)
            {
                        *pstr++ = *pDstr++;
            }
             return str;
}

 

      然後會出現一個問題,如果我們拷貝的數據中Dstr的起始位置在STR操作之間,那麼在改變str時會出現副作用,將導致我們的拷貝結果不正確,所以我們應該考慮到會覆蓋的情況。在函數庫中有一個memmove函數。 memmove:       
void *my_memmove(void *pst,const void *Dpst,int size)
{          
             void *p = pst;
             char *pstA = (char *)pst;
             char *pstB = (char *)Dpst;
            assert((pst != NULL) &&(Dpst != NULL));
             if(pstB<pstA< pstB+size)
            {
                                     while(size--)
                        {
                                    *(pstA+size) = *(pstB+size);
                        }
            }
             else
            {
                         while(size--)
                        {
                                    *pstA++ = *pstB++;
                        }
            }
             return p;
}

 

  就是遇到被拷貝的空間起始處在拷貝空間中,將會遇到拷貝內存覆蓋的現象。在這種情況下我們將考慮從尾部進行拷貝。所以進行了判斷。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved