笔试题整理【3】

一、关键字 static 的作用是什么?

(1)在函数体内,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变

(2)在模块内但在函数体外,一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外

其他函数访问,它是一个本地的全局变量

(3)在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,那就是这个函数被限制在

声明它的模块的本地范围内使用


二、局部变量能否和全局变量重名?

能,局部变量会屏蔽全局变量  要使用全局变量需要使用 “::”

局部变量可以与全局变量重名,在函数体内引用这个变量时,会用到同名的局部变量,而不会用到全局变量

对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,而那个局部变量的作用域就在那个循环体内


三、static 全局变量、局部变量、函数与普通全局变量、局部变量、函数

static 全局变量与普通的全局变量有什么区别?static 局部变量和普通局部变量有什么区别?static 函数与普通函数有什么区别?

1、static 全局变量与普通全局变量的区别:static 全局变量只初始化一次,作用域局限于一个源文件内,防止其他文件单元被

引用;非静态全局变量作用域是整个源程序在各个源文件中是有效的

2、static 局部变量只被初始化一次,下一次依据上一次结果值

3、static函数作用域仅在本文件 ,普通函数可以在当前文件之外使用


四、程序的内存分配,即一个由 C/C++ 编译的程序占用的内存分为几个部分?

全局(静态)存储区 ,编译时分配内存,全局变量和静态变量的存储是放在一块的

BSS:未初始化的全局变量和静态变量

数据段:初始化的全局变量和静态变量

代码段:存放代码常量

堆: malloc 分配内存(用户管理)

栈:局部变量和形参(操作系统管理)


五、解释堆和栈的区别?

1、管理方式不同:栈编译器自动管理,堆用户手动释放

2、空间大小不同:32位 OS 下 栈小的可怜,堆可达到 4 GB

3、能否产生碎片:对于栈有严格顺序、不会产生碎片;堆  new/delete 内存空间不连续,容易产生碎片

4、生长方向:栈向下,降序    堆向上   升序

5、分配方式不同:栈分为静态分配和动态分配;堆动态分配,无静态

6、分配效率不同:栈系统提供数据结构,计算机会在底层提供支持,进栈或出栈有专门指令,效率高

堆则不是  C/C++函数库提供,机制复杂,效率没有栈高


六、同步 IO 和 异步 IO 的区别?

同步IO:执行一个操作后,进程触发 IO 操作并等待(也就是我们说的阻塞)

或者轮询的去查看 IO 操作(也就是我们说的非阻塞)是否完成等待结果,然后才能继续执行后续的操作

异步 IO :执行一个操作后可以去执行其他的操作,然后等待通知,再回来执行刚才没执行完的操作

(想要知道更加详细的解释可以找度娘 和 相关博客)


七、A.c 和 B.c 两个 c 文件中使用了两个相同名字的 static 变量 ,编译的时候会不会有问题?这两个

static 变量会保存到哪里去(栈还是堆或者其他的)?

不会有问题

static 的全局变量只在本模块有意义,不会影响其他模块

他们都存放在静态存储区


八、typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事

例如,思考一下下面的例子:

#define dPS struct s *

typedef struct s* tPS;

以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针。哪种方法更好呢?为什么?


typedef 更好 

dPS p1,p2;

tPS p3,p4;

struct s*p1,p2;

上面的代码定义 p1 为一个指向结构的指针,p2为一个实际的结构,这也许不是你想要的。第二个正确地

定义了p3和p4两个指针


既然整理到这了再说一下  typedef 与  #define 的区别:

typedef 仅限于为类型定义符号名称, #define 不仅可以为类型定义别名,也能为数值定义别名,比如您

可以定义 1 为 ONE

typedef 是由编译器执行解释的, #define 语句是由预编译器进行处理的


九、new/delete 与  malloc/free 的区别?

不同点:

1、new/delete 是C++操作符,malloc/free 是C/C++标准库函数

2、new 第一步申请内存,第二部则调用构造函数初始化对象,同样在调用 delete 的时候

需要先调用析构函数,然后再回收堆内存。

malloc只会根据参数分配内存,默认返回指向 void* 的指针,同样 free 释放 malloc 分配的内存

3、malloc/free 是 new/delete 的一个子集

相同点:

1、都必须配对使用,这里的配对使用,可不能理解为一个 new/malloc 就对应一个 delete/free,

而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄漏

2、都是申请内存,释放内存


十、vector 和 list 的区别?

C++标准库中,容器 vector 和 list 都可以用来存放一组类型相同的数据。而且二者不同于数组的一点是

支持动态增长

不同点:

1、vector 是顺序表,表示的是一块连续的内存,元素被顺序存储;list是双向连接表,在内存中不一定连续

2、当数值内存不够时,vector会重新申请一块足够大的内存,把原来的数据拷贝到新的内存里面;

list 因为不用考虑内存的连续,因此新增开销比 vector 小

3、list 只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用vector更加合适

4、当向 vector 插入或删除一个元素时,需要复制移动待插入元素右边的所有元素;因此在有频繁插入删除操作

时,使用 list 更加合适。





猜你喜欢

转载自blog.csdn.net/ljf_djcrs/article/details/79429923