在使用这两个函数中,平时大多都使用strcpy()而忽略了memcpy(),它们都是从缓冲区拷贝内容。
byte a[4];// 每一个字节赋数值类型
a[0]=0;
a[1]=1;
a[2]=0;
a[3]=1;
byte c1[4];
memcpy(c1, a, sizeof(byte)*4);
byte c2[4];
strcpy((char*)(byte*)c2, (char*)(byte*)a);
只有memcpy()处理的是正确的,所以拿来它们的函数原型比较一下:
char *strcpy( char *strDest, const char *strSource);
void *memcpy( void *dest, const void *src, size_t count );
可以看出 strncpy() 是处理的字符串(遇零结束),memcpy()是处理一个缓冲区(void*类型的),而我们的内容中有数字0,而数字0又是字符串的结尾字符 ' \0' 的数字表现,字符串拷贝是遇到0就结束,所以,如果要拷贝的缓冲区如果是非字符串那么就尽量用memcpy(),这样可以避免出错的可能。
-------------------------------------------------------------------------
void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
}
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
char *address = strDest;
while ((*strDest++ = *strSrc++) != '')
continue;
return address;
}