关于Strcpy的复制的使用在C/C++,以及strcpy的实现分析
分为3个问题为一组,可以方面记忆;
资料来源:http://www.nowcoder.com/ta/review-c/review?query=&asc=true&order=&page=5
问题1:
void test1()
{char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
在str1上面实际是隐含有“\n”,所以说str1的字节数目是11;而string[10]是10个字节数目所以会发生数组越界
问题2:
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1 = 'a';
}
strcpy( string, str1 );
}
(1)str1是指针表示:str1的第一个元素的地址不可以进行复制;可以改为 *str1 = 'a';
(2)strcpy的copy结束的标志是'\0',所以如果没有表示位结束就会可能发生越界访问非法内存,是程序崩溃。
修改如下:
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
str1[9] = '\0';//增加结束的标志,防止越界访问非法内存。
strcpy( string, str1 );
}
问题3:
void test3(char* str1)
{
if(str1 == NULL){
return ;
}
char string[10];
if( strlen( str1 ) <= 10 )
strcpy( string, str1 );
}
}
strlen(str1) <= 10在长度等于10的时候我们知道有隐含的'\0'这是字节长度是11为,而string[10]长度是10,所以会产生数组越界
后面附上strcpy的相关知识:
//关于C的strcpy的代码编写
/*
*(1)在strcpy中的参数的形式是const char *的类型:
const是C++中进行安全检查的可以进行修饰数据类型,const修饰的是常量不可以进行修改
*(2)对strDest&strSrc指针进行有效性检查,并且有NULL进行隐式转换,最后经过throw
抛出在内存问题过程中的内存泄露
*(3)保存在复制的地址进行相应的复制保存,这样可以增加逻辑严密性
*(4)(*strDest++ = *strSrc ++)!='\0'是对于在复制过程中的边界检查,在字符的后
面通常隐藏'\0'结尾
*
*源网址解析:网址http://bbs.csdn.net/topics/310267898
*/
char *strcpy(char *strDest, const char *strSrc){
if((strDest == NULL)||(strSrc == NULL))
throw "Invalid argument(s)";
char *strDestCopy = strDest;
while ((*strDest++ = *strSrc ++)!='\0');
return strDestCopy;
}