• 改错+GetMemory问题


     试题1:

    1 void test1()
    2 {
    3  char string[10];
    4  char* str1 ="0123456789";
    5  strcpy( string, str1 );
    6 }

    试题2:

     1 void test2()
     2 {
     3  charstring[10],str1[10];
     4  int i;
     5  for(i=0; i<10; i++)
     6  {
     7   str1 ='a';
     8  }
     9  strcpy( string, str1 );
    10 }

    解答:
      试题1字符串str1需要11个字节才能存放下(包括末尾的’’),而string只有10个字节的空间,strcpy会导致数组越界;

      对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;

    正确的写法为:

    1 void test1()
    2 {
    3  char str[11];
    4  char* str1 ="0123456789";
    5  strcpy( str, str1 );
    6 }
    1 char str[10], str1[10];
    2 int i;
    3 for (i = 0; i<9; i++)
    4 {
    5     str1[i] = 'a';
    6 }
    7 str1[i] = '';
    8 strcpy_s(str, str1);

    试题3:

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

    试题3传入中GetMemory(char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完

    char *str = NULL;
    GetMemory( str ); 
    后的str仍然为NULL;

    试题4:

     1 char*GetMemory( void )
     2 { 
     3  char p[] ="hello world"; 
     4  return p; 
     5 }
     6 void Test( void )
     7 { 
     8  char*str = NULL; 
     9  str = GetMemory(); 
    10  printf( str ); 
    11 }

    试题4中
    char p[] = "hello world"; 
    return p; 
      的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。

    试题5:

     1 void GetMemory( char**p, int num )
     2 {
     3  *p = (char*) malloc( num );
     4 }
     5 void Test( void )
     6 {
     7  char*str = NULL;
     8  GetMemory( &str, 100 );
     9  strcpy( str, "hello" ); 
    10  printf( str ); 
    11 }

    在GetMemory中执行申请内存及赋值语句

    *p = (char *) malloc( num );
    后未判断内存是否申请成功,应加上:

    if ( *p == NULL )
    {
     ...//进行申请内存失败处理
    }

    未对malloc的内存进行释放。

    试题6:

    1 void Test( void )
    2 {
    3  char*str = (char*) malloc( 100 );
    4  strcpy( str, "hello" );
    5  free( str ); 
    6  ... //省略的其它语句
    7 }

    在执行char *str = (char *) malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:

    str = NULL;

    试题7:

    1 swap( int* p1,int* p2 )
    2 {
    3  int*p;
    4  *p =*p1;
    5  *p1 =*p2;
    6  *p2 =*p;
    7 }

    在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“AccessViolation”。该程序应该改为:

    1 swap( int* p1,int* p2 )
    2 {
    3  int p;
    4  p =*p1;
    5  *p1 =*p2;
    6  *p2 = p;
    7 }

     

    其他

    1.char *str(){char str[] = "hello world"; return str;}

    这个函数返回的是局部变量的地址,调用这个函数后,这个局部变量str就释放了。

    2.

    void test()
    {
      char str[10],str1[10];
      for(int i=0; i<10; i++)
      {
        str1[i] = 'a';
      }
      //str1[9]=''; //正确做法
      strcpy(str,str1);
      cout<<str<<endl;
    }

    str1没有结束符,应在strcpy之前加上str1[9]='';

    3.

    class A{const int size = 0;};这个类声明正确吗?为什么?

    错误,常量必须在构造函数的初始化列表中初始化,或将其设置为static

    class A{A(){const int size = 0;}};或

    class A{static const int size = 0;}

    4.

    class base
    {
    private:
      int i;
    public:
      base(int x){i = x;}
    };

    class derived:public base{
    private:

      int i;
    public:
      derived(int x,int y){i = x;}
      //derived(int x,int y):base(x){i = x;} //正确做法
    };

    int main(int argc, char* argv[])
    {
      base a(5);
      return 0;
    }

    要在子类中设定初始化成员变量。

    5.

    char *my_cpy(char*src,int len)
    {
      char dest[1024];
      memcpy(dest,src,len);
      return dest;
    }

    返回局部变量地址。

     6.

    请找出下面代码中的所以错误
    说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

    1、#i nclude"string.h"
    2、main()
    3、{
    4、 char*src="hello,world";
    5、 char* dest=NULL;
    6、 int len=strlen(src);
    7、 dest=(char*)malloc(len);
    8、 char* d=dest;
    9、 char* s=src[len];
    10、 while(len--!=0)
    11、 d++=s--;
    12、 printf("%s",dest);
    13、 return 0;
    14、}
    答:
    方法1:
    int main(){
    char* src = "hello,world";
    int len = strlen(src);
    char* dest = (char*)malloc(len+1);//要为分配一个空间
    char* d = dest;
    char* s = &src[len-1];//指向最后一个字符
    while( len-- != 0 )
    *d++=*s--;
    *d = 0;//尾部要加
    printf("%s ",dest);
    free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
    return 0;
    }
    方法2:
    #i nclude <stdio.h>
    #i nclude <string.h>
    main()
    {
    char str[]="hello,world";
    int len=strlen(str);
    char t;
    for(int i=0; i<len/2; i++)
    {
    t=str[i];
    str[i]=str[len-i-1]; str[len-i-1]=t;
    }
    printf("%s",str);
    return 0;
    }

  • 相关阅读:
    11月2号
    2020.9.22 (Java测试)
    2020.8.30 + 每周周报(8)
    2020.8.31
    2020.8.29
    2020.9.23
    伪分布式hbase从0.94.11版本升级stable的1.4.9版本
    python 将列表(也可以是file.readlines())输出多个文件
    hbase0.94.11版本和hbase1.4.9版本的benchamark区别
    idea 配置
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4832800.html
Copyright © 2020-2023  润新知