本试题供本人查漏补缺,题目来自网络,如有侵权,请联系作者删除,谢谢。
找错题
试题1:
void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
答案:
字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界。
试题2:
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
strcpy( string, str1 );
}
答案:
str1在数组内没有结束的标志’\0’, 当调用strcpy时,并不确定从复制了多少字节的数据到string开始所在内存上面,可能会破坏string数组后面内存中的数据。
注:
char* strcpy(char* des, const char* source)
{
char* r = des;
assert((des != NULL) && (source != NULL));
while((*r++ = *source++) != ‘\0’);
return des;
}
试题3:
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
答案:
if(strlen(str1) <= 10) 应改为 if(strlen(str1) < 10),
因为strlen调用的结果并未统计’\0’所占用的1个字节。
三周子 发布了6 篇原创文章 · 获赞 0 · 访问量 7088 私信 关注