面试小问题集锦

关于Makefile:

如何生成动态链接库和静态链接库,生成这些库的作用是什么?

无论静态库,还是动态库,都是由.o文件创建的

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。

例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。

在系统提示符下键入以下命令将创建静态库文件libmyhello.a。

# ar crv libmyhello.a hello.o

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。

例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。

在系统提示符下键入以下命令得到动态库文件libmyhello.so。

# gcc -shared -fPIC -o libmyhello.so hello.o

也可以由.c文件直接创建动态库:gcc -shared -fPIC -o libmyhello.so hello.c

我们照样使用ls命令看看动态库文件是否生成。


如何使用静态链接库?

静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

# gcc -o test test.c -L. -lmyhello


以上参考:http://blog.csdn.net/dingyuanpu/article/details/5788379

makefile命令参数-fPIC作用是什么?

当使用.so等类的库时,当遇到多个可执行文件共用这一个库时, 在内存中,这个库就不会被复制多份,让每个可执行文件一对一的使用,而是让多个可执行文件指向一个库文件,达到共用. 宗旨:节省了内存空间,提高了空间利用率.

参考:http://blog.csdn.net/azr22005/article/details/6678914

makefile命令参数-shared作用是什么?

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

grep 命令使用小介绍

grep 为一过滤器,
它可自一个或多个文件中过滤出具有某个字串的行,
或是自标准输入
过滤出具有某个字串的行。
fgrep 可将欲过滤的一群字串放在某一个文件中,
然后使用 fgrep 将包含有属于这一群字
串的行过滤出来。
grep 与 fgrep 的用法如下:
grep [-nv] match_pattern file1 file2...。
fgrep [-nv] -f pattern_file file1 file2...。
-n 把所找到的行在行前加上行号列出
-v 把不包含 match_pattern 的行列出
match_pattern 所要搜寻的字串
-f 以 pattern_file 存放所要搜寻的字串


动态链接库的特点与优势  ?
首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:  
1. 可以实现进程之间的资源共享。  
什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。  
2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。  
3. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。  
程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。


全局变量和静态局部变量有什么区别?

存储的地方是一样的,不同之处在于它们的作用域不同
全局变量基本上在程序的任何地方都能被看到
而静态局部变量只能在其指定的范围内被使用

比如

int i ;  // 全局变量

class C
{
public:
    static int i_C;  // 静态局部变量
}

void main()
{
    i = 1;        // 合法
    i_C = 1;      // 错误
    C::i_C = 1;   // 合法
    
    C cc;
    cc.i_C = 2;  // 合法
}

全局的,在main与WinMain进入点之前startup码帮助初始化。

局部的,在声明处初始化。


全局变量是在它定义以后的代码都可以访问它。
静态变量是只有在定义该变量的模块中才能访问它。
静态变量的作用域在本文件内,不能扩充到其它文件。


虽然全局变量和静态局部变量都是以静态存储方式存储的,但全局变量的作用域是从定义开始到文件结束,在作用域内的所有函数都是可见的,也就是说对作用域内的所有函数都可以使用,而静态局部变量虽然也是以静态存储方式存储,但它的作用域只限定于定义的函数,对其它函数来说是不可见的,因而也不能使用.


变量可以分为全局变量、静态全局变量、静态局部变量和局部变量
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。


全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。


代码如下:

//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1()
{
  cout<<b<<endl<<a<<endl;//结果为5
}


//main.cpp
int a;
int b=10;
void func2()
{
  static int i;
  i++;
  cout<<i<<endl;
}


void func1();


void main()
{
  a=20;
  func1();
  func2();
  func2();
}


输出结果为
5
20
1

2


new和malloc的区别?


1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 


2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。

对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 


3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 

4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存


new 是个操作符,和什么"+","-","="...有一样的地位.
 
malloc是个分配内存的函数,供你调用的.
 
new是保留字,不需要头文件支持.
malloc需要头文件库函数支持.


new 建立的是一个对象,
malloc分配的是一块内存.
 
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.


简而言之:
new   是一个操作符,可以重载   
malloc是一个函数,可以覆盖   
new   初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数   
malloc仅仅分配内存,free仅仅回收内存


以上来自:http://www.cnblogs.com/sukairui/archive/2007/10/19/931001.html


构造散列函数的方法?

(1)平方取中法
(2)除余法
(3)相乘取整法
(4)随机数法

以上来自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.4.2.htm

声明和定义的区别?


一个声明就是一个定义,除非
- 它声明了一个没有详细说明函数体的函数
- 它包含一个extern定义符并没有初始化或函数体
- 它是一个包含在一个类之内的数据成员的声明
- 它是一个类的声明
- 它是一个typedef的声明


一个定义就是一个声明,除非
- 它定义了一个静态成员函数
- 它定义了一个成员函数

以上来自:http://bbs.csdn.net/topics/80311941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值