一个关键的函数——strcpy的实现
1. strcpy函数的原型是:
/*简单的形式,但是这种形式没有考虑内存重叠的情形*/ char* strcpy(char* dst, const char* src) { assert(dst != NULL&&src != NULL); char* ret = dst; while ((*dst++ = *src++) != '\0'); return ret; }
几个注意点:[1]const修饰;[2]空指针检查;[3]返回目标地址
2.假如要考虑dst和src内存重叠的情况,strcpy应该如何实现?
所谓的内存重叠,发生在src未处理的部分被dst覆盖的情况下——src<=dst<=src+strlen(src)
C函数的memcpy()自带内存重叠检测功能。
于是strcpy的实现实际如下,利用了memcpy函数来进行运算。
/*strcpy函数中,使用memcpy来防止内存重叠问题*/ char* strcpy(char* dst, const char* src) { assert(dst != NULL&&src != NULL); char* ret = dst; /*要格外注意,这里memcpy的参数中有+1,这是看了好久的困惑了!因为涉及到memcpy函数的局限性*/ memcpy(dst, src, strlen(src) + 1); return ret; }
关于memcpy函数:
注意:memcpy函数实现内存拷贝,可以拷贝任何数据类型。源数据类型不能被改变。
函数原型为:void* memcpy(void* dst, const void* src, int cnt)
memcpy函数需要注意的点为:
1.空指针的问题,如果dest、src两者或者两者之一为NULL;
2.拷贝大小count为小于等于0的值;
3.内存重叠。
void * memcpy(void *dst, const void *src, size_t cnt) { assert(dst != NULL&&src != NULL&&cnt > 0); if (dst == src) return dst; void *ret = dst; if (dst > src&&(char*)dst < ((char*)src + cnt)) { dst = (char*)dst + cnt - 1; src = (char*)src + cnt - 1; while (cnt--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } else { while (cnt--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } return dst; }