问答题
分析代码
1分析下面代码有什么问题?
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1 = 'a';
}
strcpy( string, str1 );
}
answer:
首先,代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用 *str1 = ‘a’;
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到’ ’为止。所以拷贝的长度是不定的。如果一直没有遇到’ ’导致越界访问非法内存,程序就崩了。
完美修改方案为:
void test2() { char string[10], str1[10]; int i; for(i=0; i<9; i++) { str1[i] = 'a'; } str1[9] = ' '; strcpy( string, str1 ); }
2指出下面代码有什么问题?
void test3(char* str1)
{
if(str1 == NULL){
return ;
}
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
answer:
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’ ’所占用的1个字节。
3看看下面的一段程序有什么错误?
swap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
answer:
1.需要一个返回值void
2在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:
void swap( int* p1,int* p2 ) { int p; p = *p1; *p1 = *p2; *p2 = p; }
id swap( int* p1,int* p2 )
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}