自定义函数中cat和cpy有问题,程序会出现内存的非法操作信息,vc6.0会报错

#include
#include
using namespace std;
void creat(char * & rp, const char *str);
void cat(char * & rp, const char *str);
void cpy(char * & rp, const char *str);

int main()
{
char *p=NULL;
cout<<"以字符串1234为初值创建动态字符数组p"<<endl;
creat(p,"1234" ); //调用自定义函数creat,创建动态字符数组p,初始化信息为"1234"
cout<<"p="<<p<<endl; //输出p中保存的字符串信息
cout<<"strlen(p)="<<strlen(p)<<endl; //输出p中保存的字符串长度
cout<<endl;

cout<<"以字符串abcde为初值再次创建动态字符数组p"<<endl;
creat(p, "abcde");  //动态字符数组p已经创建,再次创建会报错,然后终止creat函数调用
cout<<"p="<<p<<endl;  //输出p中保存的字符串信息
cout<<"strlen(p)="<<strlen(p)<<endl;  //输出p中保存的字符串长度
cout<<endl;

cout<<"字符串0123456789012345789连接到p中保存的字符串的后面"<<endl;
cat(p, "01234567890123456789");  //调用自定义函数cat,将字符串"01234567890123456789"连接到动态数组p中保存的字符串的后面
cout<<"p="<<p<<endl;  //输出p中保存的字符串信息
cout<<"strlen(p)="<<strlen(p)<<endl;  //输出p中保存的字符串长度
cout<<endl;

cout<<"字符串01234567890123456789复制到p中"<<endl;
cpy(p,"01234567890123456789");  //调用自定义函数cpy,将字符串"01234567890123456789"复制到动态数组p中
cout<<"p="<<p<<endl;  //输出p中保存的字符串信息
cout<<"strlen(p)="<<strlen(p)<<endl;  //输出p中保存的字符串长度
cout<<endl;
return 0;

}

void creat(char * & rp,const char *str)
{
if(rp!=NULL)
cout<<"该动态数组已经创建,不能重复创建,创建操作调用失败!"<<endl;
else
{
int len; //变量len将保存形参变量str中指向的字符串的长度

    len=strlen(str); //循环体语句为空,变量len直接递增至字符串的长度值

    rp=new char[len+1]; 

    if(rp==NULL) 
    {
        cout<<"内存空间不足,调用失败!"<<endl;
        return;  //退出f的调用
    }
    strcpy(rp,str);
}

}

void cat(char * & rp, const char *str)
{
strcat(rp, str);
}

void cpy(char * & rp, const char *str)
{
strcpy(rp, str);
}

strcat 需要目标的内存足够大,你这边应该不够,超出边界了。