一点声明:
本试题整理供本人查漏补缺,题目来自网络,如有侵权,请联系作者删除;若有错误,请不吝指出,万分感谢。
目录
找错题
试题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数组后面内存中的数据。
注:
/*strcpy的实现代码*/
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个字节。
注:
//strlen C语言函数实现
int strlen(const char* str)
{
assert(str != NULL);
int len = 0;
while((*str++) != '\0' )
len++;
return len;
}
试题4:
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
答案:
GetMemory函数的形参是字符串指针,在函数里面改变形参的值并不能真正改变传入形参的值。
执行完char *str =NULL; GetMemory(str); 之后,str仍然指向NULL。
试题5:
char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}

&spm=1001.2101.3001.5002&articleId=104540537&d=1&t=3&u=89b73e3ddeb245bf92e2018b59db1bf2)
8064

被折叠的 条评论
为什么被折叠?



