前文已经提到过,这里再详细的分析一下:
strcpy,仅适用于字符串的复制+无法决定复制的长度,只能到‘\0’才结束,所以容易越限。
memcpy,范围更广,不仅适用于字符串,还有其他的数据类型+能决定复制的长度。
1、strcpy()函数实现
并没有对越限的情况进行处理,所以如果越限了会造成不可知的错误。
char* strcpy(char* dest, const char* src)
{
if(dest==NULL||src==NULL)
return NULL;
char* temp = dest;
for(;src;src++,temp++)
{
*temp = *src;
}
*temp = '\0';
//*temp = *src;//上条语句可以写成这样。
return dest;
}
以上实现方法还可以简化:
char * strcpy(char * dest, const char * src)
{
if ((src == NULL) || (dest == NULL))
return NULL;
char *strdest = dest;
while ((*strDest++ = *strSrc++)!='\0');
return dest;
}
因为while循环是由多个if +1个else组成的,且最终退出循环是条件不成立的时候,所以最终是将'\0'字符也赋值成功了。
2、memcpy的实现:
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
if((memTo == NULL) || (memFrom == NULL))
return NULL;
char *tempFrom = (char *)memFrom;
char *tempTo = (char *)memTo;
while(size -- > 0)
*tempTo++ = *tempFrom++ ;
return memTo;
}
char *ch[128];
struct st{
int mm;
double bb;
} nn;
nn.mm = 2;
nn.bb = 2.3;
memcpy(ch,(char*)&nn,sizeof(struct st)); //(char*)&nn 是不是用char* 转应该都行。