关于经典笔试题目strcpy的一个小疑问
实现strcpy是一个经典的笔试题,大家应该都看过,
但GNU-C中的实现如下:
char* strcpy(char *d, const char *s)
{
char *r=d;
while((*d++=*s++));
return r;
}
为什么这里就不需要检查指针的有效性?
[解决办法]
底层简洁高效为佳,但还是得看实现
glibc2.5
/* Copy SRC to DEST. */
char *
strcpy (dest, src)
char *dest;
const char *src;
{
reg_char c;
char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
size_t n;
do
{
c = *s++;
s[off] = c;
}
while (c != '\0');
n = s - src;
(void) CHECK_BOUNDS_HIGH (src + n);
(void) CHECK_BOUNDS_HIGH (dest + n);
return dest;
}
libc_hidden_builtin_def (strcpy)
char* strcpy(char *d, const char *s)
{
char *r=d;
while((*d++=*s++));
return r;
}