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個字元用來存放結束符。如果不曉得這點的話,使用者編寫的程式也可能打印出來的是很長的字串或是末尾攜帶一些亂碼了。