linux中memcpy和strcpy的區別

strcpy是拷貝字符串,以\0爲標誌結束(即一旦遇到數據值爲0的內存地址拷貝過程即停止)
strcpy的原型爲:
char *strcpy(char *dest, const char *src)

其在內核源碼中(lib/string.h)的實現如下:

char *strcpy(char *dest, const char *src)
{
        char *tmp = dest;

        while ((*dest++ = *src++) != '\0');
                /* nothing */;
        return tmp;
}

即最關鍵的一點是用到了如下的循環

 while ((*dest++ = *src++) != '\0')

這就是爲什麼用此複製字符串是會出現異常終止的現象。也可以看出strcpy最終是給目的串的末尾賦了結束符'\0'的。

而memcpy是給定來源和目標後,拷貝指定大小n的內存數據,而不管拷貝的內容是什麼,根據定義可知不僅限於字符之間的操作。
memcpy的原型爲:
void *memcpy(void *dest, const void *src, size_t n);

其在內核源碼中(lib/string.h)的實現如下:

void *memcpy(void *dest, const void *src, size_t count)
 {
         char *tmp = dest;
         const char *s = src;
         while (count--)
                 *tmp++ = *s++;
         return dest;
 }

不難看出,如果你用來複制字符串,memcpy複製的最後並沒有給目的字符串dset賦結束符'\0'(由用戶的源字符串長度和內容決定)。假如用戶源字符串很長,而只需複製一段給目標dest串,因此如果用戶要打印複製的結果,那麼最後的一步操作就是給dest[count]='\0'。然而這時用戶的設置的目的串要足夠大,至少比count大1個字符用來存放結束符。如果不曉得這點的話,用戶編寫的程序也可能打印出來的是很長的字符串或是末尾攜帶一些亂碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章