先来看一个常见的C++面试题目:
void test()
{
charstring[10],str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] ='a';
}
strcpy( string, str1 );
}
这个题目错误在于哪里?
答:数组越界,在对str[i] = 'a';循环赋值过程中最后没有'/0'标识符,导致在strcpy进行拷贝的时候越界,会导致程序崩溃,
看strcpy的内部实现:
char * strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
}
看到没,是直接赋值!没有参数检测assert(dst != NULL);和assert(src != NULL));,也没有'\0'字符串结尾判断。
现在我们将程序改一下,如下:
char* strcpy_1(char* dest, const char* src)
{
char * ret = dest;
memmove(ret, src, strlen(src)+1);
return