strcpy函数的实现,考虑内存重叠情况

来源:互联网 发布:木桶原理与系统优化 编辑:程序博客网 时间:2024/06/04 01:10

这里贴出strcpy函数的简单实现,其中考虑内存重叠情况的是函数是mystrcpy2,但是单传递内存重叠的实参的时候运行总是出错,网上的代码基本都是这样实现的,不知道别人运行的时候有没有出错

#include <string.h>#include <stdio.h>#include <stdlib.h>#include <assert.h>//这种实现如果遇到内存重叠就会出错,如mystrcpy(Src+1,Src);'\0'由于被覆盖导致出现死循环char *mystrcpy(char *strDest, const char *strSrc){assert((strDest != NULL) && (strSrc != NULL));char * address = strDest;while ((*strDest++ = *strSrc++) != '\0');return address;}//考虑内存重叠的字符串拷贝函数char *mystrcpy2(char *strDest, const char *strSrc){assert((strDest != NULL) && (strSrc != NULL));char *ret = strDest;char *d, *s;int size = 0;d = (char *)strDest;s = (char *)strSrc;size = strlen(strSrc) + 1;printf("size = %d\n", size);if (strDest >= strSrc && strDest <= strSrc + size) {d += size - 1;s += size - 1;while (size--){*d-- = *s--;//vs2017 win10 运行到此处有问题但不提示错误直接退出,vs2010 win7提示内存冲突}}else {while (size--)*strDest++ = *strSrc++;}return ret;}int main(void){char *Src = "abcde";char *Dest2 = Src + 2;printf("%s\n", Src);mystrcpy2(Dest2, Src);printf("%s\n", Dest2);system("pause");return 0;}