首先先说一下strcpy,流行的strcpy函数写法是:
- char *my_strcpy(char *dst,const char *src)
- {
- assert(dst != NULL);
- assert(src != NULL);
- char *ret = dst;
- while((* dst++ = * src++) != '\0')
- ;
- return ret;
- } view plaincopy
1,检查指针有效性;
2,返回目的指针des;
3,源字符串的末尾 '\0' 需要拷贝。
写出上面实现函数就不在话下。
然而这样的实现没有考虑拷贝时内存重叠的情况,下面的测试用例就能使调用my_strcp函数的程序崩溃:
- char str[10]="abc";
- my_strcpy(str+1,str);
strcpy的正确实现应为:
- char *my_strcpy(char *dst,const char *src)
- {
- assert(dst != NULL);
- assert(src != NULL);
- char *ret = dst;
- memcpy(dst,src,strlen(src)+1);
- return ret;
- }
memcpy和memmov函数原型和区别
memcpy()函数从src内存中拷贝n个字节到dest内存区域,但是源和目的的内存区域不能重叠。在对待重叠区域的时候,memmove可以正确的完成对应的拷贝。
- void* my_memcpy(void* dst, const void* src, size_t n)
- {
- char *tmp = (char*)dst;
- char *s_src = (char*)src;
- while(n--) {
- *tmp++ = *s_src++;
- }
- return dst;
- }
- void* my_memmove(void* dst, const void* src, size_t n)
- {
- char* s_dst;
- char* s_src;
- s_dst = (char*)dst;
- s_src = (char*)src;
- if(s_dst>s_src && (s_src+n>s_dst)) { //源地址和目标地址重叠,低字节向高字节拷贝
- s_dst = s_dst+n-1;
- s_src = s_src+n-1;
- while(n--) {
- *s_dst-- = *s_src--;
- }
- }else {
- while(n--) {
- *s_dst++ = *s_src++;
- }
- }
- return dst;
- }