试题1:

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

试题2:

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

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

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

正确的写法为:

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

试题3:

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

试题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, );
  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( );
  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]='\0'; //正确做法
  strcpy(str,str1);
  cout<<str<<endl;
}

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

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);//要为\0分配一个空间
char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加\0
printf("%s\n",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;
}

改错+GetMemory问题的更多相关文章

  1. 【C++基础】内存操作 getMemory改错

    内存操作的考察点:①指针 ②变量生存期及作用范围 ③动态内存申请和释放 笔试题************************************************************* ...

  2. C++面试之GetMemory问题

    http://blog.csdn.net/zhuxiaoyang2000/article/details/8084629 #include <iostream> #include < ...

  3. JAVA程序改错 (易错题)

    JAVA程序改错 1. abstract class Name { private String name; public abstract boolean isStupidName(String n ...

  4. 关于内存 GetMemory( ) 笔试分析

    1. #include<stdio.h>#include<string.h>void GetMemory(char *p){ p=(char *)malloc(100); }i ...

  5. YTU 2610: A改错题--体检情况分析

    2610: A改错题--体检情况分析 时间限制: 1 Sec  内存限制: 128 MB 提交: 233  解决: 161 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. ...

  6. YTU 2609: A改错题--学生信息的输入和输出

    2609: A改错题--学生信息的输入和输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 238  解决: 157 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方 ...

  7. GetMemory 函数解析

    GetMemory函数 代码1: void GetMemory(char *p){ p = (char*)malloc(100);}int main(int argc, char *argv[]){ ...

  8. GetMemory()函数

    NO1 void GetMemory(char *p) { p=(char *)malloc(100); } void Test() { char * str=NULL; GetMemory(str) ...

  9. GetMemory那一题的理解

    #include "stdafx.h" #include <iostream> void GetMemory(char *p,int num) { p = (char* ...

随机推荐

  1. 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)

    ========================================================================================== 最近一直在看Dee ...

  2. gradle构建依赖

    本地依赖 gradle 作为构建工具,能够很方便的使用本地jar包,以下为使用的代码块. dependencies { //单文件依赖 compile files('libs/android-supp ...

  3. 在JS中调用JAVA变量

    在JS中调用JAVA变量可以,方法是:var JS变量名 = “<%=JAVA变量名 %>”<%中间写java代码,跟在JSP中一样%>在JAVA中 ,无法调用JS变量

  4. 伪静态规则写法RewriteRule-htaccess详细语法使用

    一.正则表达式教程伪静态规则写法RewriteRule-htaccess详细语法使用教程分享简单说下:伪静态实际上是利用PHP把当前地址解析成另外一种方法进行访问网站!要学伪静态规则的写法,你必须得懂 ...

  5. Lammp安装过程

    -1     建设环境 创建mysql数据库的lvm环境                创建lv逻辑卷                新安装一个硬盘25G sdb                #fd ...

  6. js序列化json对象

    SerializeJsonToStr : function( oJson ) { if( oJson == null ) return "null"; if( typeof(oJs ...

  7. javascript string对象的属性与方法

    一 创建string对象 new string('string'); 更直接的定义方法是var str = 'string'; 二 string属性 1.constructor 2.lenght 字符 ...

  8. 关于《s3c2416裸跑环境配置》一文的一些补充

    <s3c2416裸跑环境配置>一文已经发表很长一段时间了,前两天突然收到邮件提示有人回复,原来网友jxyggg按照文中所讲去调试,却始终不能成功.问题的描述见原文后的回复,经过QQ交流,问 ...

  9. 就是爱Java

    就是爱Java,提供了Java代码示例,文章和教程,可以帮助你学习Java编程语言. 网站名称:就是爱Java 网站地址:http://java.openyu.org

  10. 纯CSS实现三列DIV等高布局

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...