分析下面代码有什么问题?

分析下面代码有什么问题?


void test2() 
{ 
 char string[10], str1[10]; 
 int i; 
 for(i=0; i<10; i++) 
 { 
 str1  = 'a'; 
 } 
strcpy( string, str1 ); 
}
参考答案
首先,

代码根本不能通过编译。因为数组名str1为 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 );
}

void test3(char* str1) 
{ 
 if(str1 == NULL){
        return ;
 }
 char string[10]; 
 if( strlen( str1 ) <= 10 ) 
 { 
 strcpy( string, str1 ); 
 } 
}

参考答案
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字



void GetMemory( char *p ) 
{ 
 p = (char *) malloc( 100 ); 
} 
void Test( void )  
{ 
 char *str = NULL; 
 GetMemory( str );  
 strcpy( str, "hello world" ); 
 printf( str ); 
}

参考答案
传入中Gemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的实参值,执行完
char *str = NULL;
GetMemory( str );
后的str仍然为NULL;
1:穿入形参并不能真正改变形参的值,执行完之后为空;
2:在函数GetMemory中和Test中没有malloc对应的free,造成内存泄露


char *GetMemory( void ) 
{  
 char p[] = "hello world";  
 return p;  
} 
void Test( void ) 
{  
 char *str = NULL;  
 str = GetMemory();  
 printf( str );  
}

参考答案
char “hello world”;
return p;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期


写出完整版的strcpy函数
参考答案
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分

void strcpy( char *strDest, char *strSrc ) 
{ 
  while( (*strDest++ = * strSrc++) != ‘\0’ ); 
}

4分

void strcpy( char *strDest, const char *strSrc )  
//将源字符串加const,表明其为输入参数,加2分 
{ 
  while( (*strDest++ = * strSrc++) != ‘\0’ ); 
}

7分

void strcpy(char *strDest, const char *strSrc)  
{ 
 //对源地址和目的地址加非0断言,加3分 
 assert( (strDest != NULL) && (strSrc != NULL) ); 
 while( (*strDest++ = * strSrc++) != ‘\0’ ); 
}

10分
//为了实现链式操作,将目的地址返回,加3分!

char * strcpy( char *strDest, const char *strSrc )  
{ 
 assert( (strDest != NULL) && (strSrc != NULL) ); 
 char *address = strDest;  
 while( (*strDest++ = * strSrc++) != ‘\0’ ); 
 return address;
}

你可能感兴趣的:(笔试题)