下面程序出现什么问题?
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1 = 'a';
}
strcpy( string, str1 );
}
- 数组名str为
char *const
类型的右值类型,根本不能赋值。 - 想对数组的第一个元素赋值,也要使用
*str1 = 'a';
- 使用库函数
strcpy
进行拷贝操作,strcpy
会从源地址一直往后拷贝,直到遇到'\0'
为止。所以拷贝的长度是不定的。如果一直没有遇到'\0'
导致越界访问非法内存,程序就崩了
正确修改为
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<9; i++)
{
str1[i] = 'a';
}
str1[9] = '\0';
strcpy( string, str1 );
}
写出完整版的strcpy函数
char * strcpy( char *strDest, const char *strSrc )
//将源字符串加const,在函数体内不可变,表明其为输入参数
{
//断言原字符串地址和目标字符串地址为非空
assert( (strDest != NULL) && (strSrc != NULL) );
//将赋值后的目标地址返回
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}