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

来源:互联网 发布:宁波二手房交易数据 编辑:程序博客网 时间:2024/05/01 13:28

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


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;}
原创粉丝点击