目標(biāo)緩沖區(qū) 小于 實際緩沖區(qū)
char *name = "1234567890";
char name2[6]={0};
memcpy_s( name2 , sizeof(name2) , name, strlen(name));
動態(tài)執(zhí)行失敗 (DEBUG ASSERTION FAILED !) 運行庫和調(diào)試庫都會提示出錯.
注意: 指針sizeof( 指針 ) = 4
strncpy(name2,name ,sizeof(name) ); 打印name2 1234
strncpy(name2,name ,strlen(name) ); 打印name2 123456IOIPNUUY
優(yōu)化這個語句,盡量拷貝內(nèi)容
strncpy(name2,name , strlen(name)>sizeof(name2)? sizeof(name2): strlen(name) );
目標(biāo)緩沖區(qū) 小于 實際緩沖區(qū)
strncpy(name2,name ,sizeof(name2)-1 );
sizeof(name2)-1 ------------>讓最后一個name2字符留給\0 否則這個字符也被拷貝了.
看一下LINUX下的兩個函數(shù)的源代碼,印象會更加深刻一些
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp = (char *) dest, *s = (char *) src;
while (count--)
*tmp++ = *s++;
return dest;
}
char * strcpy(char * dest,const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
老實講,這兩個函數(shù)長得是很帥
參考
http://stackoverflow.com/questions/4593907/difference-between-strncpy-and-memcpy
http://www.cppblog.com/Tim/archive/2011/04/02/143259.aspx