C/C++ strcpy字符串拷贝函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/24 19:24:40
char *strcpy2(char *strDest, const char *strSrc)
{
ASSERT((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
*strDest=*strSrc;
while (*strDest!='\0')
{
*strDest++;
*strSrc++;
*strDest=*strSrc;
}
return address;
}
char *strDest是说 strDset是字符串指针吧,那么 上面用到的*strDest是什么? 指针的指针?为什么不直接用 strDset 与strSrc进行操作呢?
我尝试了,没实现,如果可以实现应该怎么写?

还有就是如果我这么写:
char *asd1=new char[10];
char *asd2=new char[10];
asd2="asd1231231";
strcpy2(asd1,asd2);成功
asd1如果写成:
char *asd1=new char[10];
asd1="1234567890"; 系统崩溃! 难道说不能赋值?
而且不给asd1分配空间大小 他也会崩溃! 为什么?
char asd[10]; 是什么意思?char类型数组?那么例如asd[0]里面存储的是一个char类型数据?也就是说1个字节? 那么在strcpy指针移动的时候 指针就是数组指针了吗?
分不够可以加!!!谢谢大家!!
你们的答案 都不太一样啊!首先
1我复制 那个asd1231231的确是10个+上\0越界了 这个我承认!然而其他的问题 我不知道该听你们谁的!

先回答你的问题,看来你不懂什么是指针,什么是字符数组和字符串的区别。

char *strDest是说 strDset是字符串指针,它指向的地址里面存放的数据是char类型的。
strDest是char*类型的指针,而指针strDest前面加*号,表示取指针指向的地址中的值。
所以,*strDest是取指针strDest指向的地址里面的内容,也就是说*strDest是char类型的值

这就是“直接用 strDset 与strSrc进行操作”啊,你为什么说它“不直接”呢?
难道你还想直接对指针赋值,如strDset = strSrc,这只改变指针的指向而已
并没有改变指针指向的地址里面的内容,这种操作是错误的,下面详细分析

char *asd1=new char[10]; //给指针asd1分配了一块10字节的内存
char *asd2=new char[10]; //给指针asd2分配了一块10字节的内存
asd2="asd1231231"; //改变了指针asd2的指向,它从新指向了常量字符串"asd1231231"的地址
//这种操作是错误的。因为本来asd2指向刚分配的10字节的内存,改变指向后,刚分配的内存,就无法释放了,从而造成了内存泄漏,运行你的程序,内存会越来越少,系统会越来越慢的
strcpy2(asd1,asd2);//虽然能成功,但常量字符串“asd1231231”占11个字节,因为它后面有字符串的结束符号‘\0’,从而,会导致asd1的内存越界。

char *asd1=new char[10];
asd1="1234567890"; //指针asd1指向了常量字符串,常量是不能改变的
strcpy2(asd1,asd2);//如果再想用asd2指向的数据,赋值给asd1指向的地址,当然会导致系统崩溃!因为你在试图修改常量的值

char asd[10];//是10个char类型元素的字符数组,asd[0]里面存储的是一个char类型数据,是