一份C++实习生的笔试题目

一、基础知识
1、 下面几个是在编程领域里经常使用的缩写,请写出他们的英文全写,并翻译成中文。注意是编程领域.
(1) OS  operating system 操作系统  或者是open source 开发源代码
(2) VS  Visual Studio 软件开发平台
(3) MS  Microsoft 微软的缩写,或者Management System  管理系统
(4) CS  cryptographic system密码系统 或者 computer science 计算机科学的缩写
(5) RTOS  Real-time operating system 实时操作系统
(6) SDK   Software Development Kit, 即软件开发工具包 
(7) IDE    Integrated Drive Electronics  集成驱动器电子 它的本意是指把控制器与盘体集成在一起的  Integrated Development Environment  集成发展(开发)环境


2、 下列几个C语言表达式是否正确?如果正确,写出它们表达的意思:
(1) a&b     正确  位运算,将a的每一个与b的每一个位进行&操作
(2) a&(&b)  正确 &b先取得b的地址,再与b的地址按位与
(3) a&&b   正确  逻辑与,就是将a的值与b的值进行与运算
(4) a**b    正确  *b先取得b地址的值,a*b的值相乘


3、 在编程风格中,一般都要强调使用匈牙利命名法,下面是匈牙利命名法中一些公认的前缀,并给出变量名的例子,请写出它们所代表的变量类型:
前缀 变量名    描述前缀的意义
g_   g_Lock     全量变量
m_   m_Num    成员变量
   pTrack      指针
h    hModule     句柄
sz   szText       字符串
dw  dwMsg       双字

4、头文件中ifndef / define / endif 是做什么用的?

答:防止该头文件被重复引用。

14. i nclude 与 #i nclude "file.h"的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h


5、代码里有时可以看到extern “C”, 这语句是做什么用的?

 答:extern "C"是连接申明(linkage declaration),extern "C"修饰的变量和函数是按照C语言方式编译和连接的


6、软件开发中说的check out, check in是什么意思?

答:源代码管理系统的签入,签出

就是在比较大的项目中,为了避免不同的人编辑相同的代码,导致代码覆盖等错误,设计了树形的结点,将一份较大的代码,分成很多tcl(小的部分),每个人改动代码时,将要改动的代码check out 这时别人就不能对代码改动,你改完了,再check in 回到结点上,别人才可以 check out 进行修改,这样在大型的软件开发中避免了代码的覆盖写冲突等问题

7C语言函数前面加static,和C++类的成员函数前面加static,两者的意义有何区别?

答:Cstatic是限制函数的为编译单元内部使用C++类的static使函数成为类成员,而不是实例成员。

基本差不多,但C++类中的有不同之处。就是可以直接用类名去调用函数,不用实例化对象。 如: 类名.xxx();


8、简单描述一下WIN32上 .c / .cpp / .rc / .obj / .res / .lib / .dll / .exe这几个后缀所表示的文件类型,以及他们之间的相互生成关系。如果你是LINUX程序员,前面这个问题答不上,那么请描述一下GCC编译的几个步骤和中间生成文件。

答:.c: C代码
        .cpp: C++代码
        .obj:目标代码(.c.cpp编译后产生)

         .rc:资源文件
         .res:编译后的十进制资源(.rc编译后产生)

        .exe:可执行程序
        .dll:动态链接库
        他们由.obj链接生成。



二、简单代码
1
char* GetMemory(void)
{
  char p[] = “Welcome to AMOI”;
  return p;
}
void main(void)
{
  char* str = NULL;
  str = GetMemory();
  printf(str);
}
运行main函数的结果如何?你觉得该段代码是否存在什么问题?

答:结果是乱码。

char *p = “Welcome to AMOI”;就没有问题了!因为return p只是返回了数组的首地址,虽然在语法上面没有错,可以通过这个数组的首地址来得到里面的值,但是得到的信息是错误,因为只是得到了这个首地址里面的值,没有得到整个数组的值,如果返回的是指针类型的地址,则可以得到整个数组的值!
因为GetMemory返回的是指向栈内存的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

我也来说说,对以第一个程序:是错误的
原因在于:
char* GetMemory(void) 

  char p[] = “Welcome to AMOI”; 
  return p; 
}
这里使用的p是一个局部变量,程序完成后就将回收其存在栈中的空间,所以返回引用不能使用
改进:
char* GetMemory(char *ptr) 

  ptr = "Welcome to AMOI"; 
  return ptr; 
}

验证是正确的!

有的人这样改:

char* GetMemory(void)
{
//char p[] = Welcome to AMOI;
char *p = Welcome to AMOI;
return p;
}
哥们,对于第一题 你这种改发也是错的。因为GetMemory内的“Welcome to AMOI”是常量字符串,它在程序生命期内恒定不变。无论什么时候调用GetMemory,它返回的始终是同一个只读的内存块

总之你不能返回函数中的局部指针变量,除非你让这个局部指针变量 你调用函数之前就存在的指针(并且这个指针不是个空指针)。


2
void GetMemory(char** p, int len)
{
  *p = (char*)malloc(len);
}
void main(void)
{
  char* str;
  GetMemory(&str, 100);
  strcpy(str, “Hello World”);
  printf(str);
}
运行main函数的结果如何?你觉得该段代码是否存在什么问题?

答:能够输出"hello world!"

        内存泄露

   这里,我们使用了堆来分配空间,但是分配率空间后,我们没有主动地将分配的空间清空同时对于传入的空间的检测也没有到位(这些前面的兄弟都说过了)
改进:
void GetMemory(char** p, int len) 

  if (len <= 0) {
  printf("说明性的语句");
  *p = NULL;
  }

  *p = (char *)malloc(len*sizeof(类型))
  if (*p == NULL) {
  printf("说明性语句");
  exit(1);
  }
}
然后是主程序中最后添加
free(str);

ok

http://topic.csdn.net/u/20090211/16/773219a4-bb84-4702-8669-28fef466af62.html

你可能感兴趣的:(个人文章)