面试的方向
- C 语言编程基础——初级
- C 语言编程基础——高级
- 数据结构与算法
- linux 基本操作
- 常用工具 —— git
C 语言编程基础——初级
预处理
1. 什么是预处理、熟悉那些预处理命令简单说一下
在编译之前对源文件进行简单加工的过程,就称为预处理。以#开头的命令为预处理命令。如文件包含命令#include、宏定义命令#define、条件编译#if等。
2. #与##的作用
#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。
3. 如何避免头文件被重复包含
为避免头文件被重复包含,可在其中使用条件编译
#ifndef XXX // 或者ifdef XXX
#define XXX
// 代码块
#endif
4.#include 导入头文件时双引号" "和尖括号<>的区别
5. 预处理知识总结链接
关键字
1.static和extern关键字的使用特点
- static修饰的变量称为静态变量。其存储方式为静态存储方式,变量存储在静态全局区。
- 当static修饰局部变量时,变量的生命周期会被修改,在程序的整个运行过程中都不会被释放。但不会改变变量的作用域。
- 当static修饰全局变量时,会改变变量的作用域。被static修饰的全局变量只能在本文件中使用,在其他文件中不可以通过extern关键字进行声明后使用。因为全局变量存储在静态全局区,所以生命周期不会发生改变。
2.const 和 define 关键字的使用特点和区别
3.typdef 和 define关键字的使用特点和区别
关键字参考链接
http://c.biancheng.net/cpp/html/797.html
c语言中的作用域
1.在c语言编程中,编译器可以确认那几类不同类型的作用域
- 代码块作用域,即函数中花括号括起来的代码块。
- 文件作用域(全局作用域),任何在代码块之外声明的标识符都具有文件作用域。即默认为外部链接,可以用extern关键字声明使用
- 原型作用域,如函数声明。
- 函数作用域,只在当前函数内有效
储存方式
内部链接和外部链接
1.内部链接和外部链接的特点和区别
区别:在链接时,能否被其他的编译单元所访问
特点:
内部链接
1.在链接的时候其他的编译单元(被编译的文件如.c文件)无法链接到它且不会与其它编译单元中的同样的名称相冲突,如static修饰的全局变量和函数,不可以使用extern声明在其他的编译单元使用
2.内部链接变量是通过副本传递的,即可以使用文件导入的方式
外部链接
1.在链接的时候其他的编译单元可以访问它,即它可以和别的编译单元交互。 例如全局变量和函数默认就是外部链接, 可以通过extern引用。
静态链接库和动态链接库
数据类型
内存管理
1.什么是内存溢出,什么是内存泄漏。并说几个实例
内存溢出
指程序在申请内存时,没有足够的内存空间供其使用,或者是你要求分配的内存超出了系统能给你的,系统不能满足需求出现内存溢出
实例:
- 比如申请了一个int类型的4字节空间,但给它存了long类型8字节才能存下的数。
- 使用malloc函数在堆空间开辟1000个字节大小的空间,但在堆空间中没有这么大的空间。
内存泄露
指程序在申请内存后,无法释放已申请的内存空间。如使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序没有调用相应的函数free或delete释放该内存块。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。内存泄露会最终会导致内存溢出!
实例:
- 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。如for/while中的内存泄漏
- 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。如if/switch中的内存泄漏
- 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
- 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
注意:
内存泄漏本身不会产生什么危害,真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。
c程序编译过程
1.C代码编译生成可执行程序的过程有哪几个步骤,各步骤都具体做了什么
将c文件编译生成可执行程序需要经过预处理->编译->汇编->链接四个步骤,如下图
- 预处理:处理所有以#开头的预处理命令,并去掉注释
- 编译:使用编译器将预处理文件test.i编译成汇编文件test.s。
- 汇编:使用汇编器将汇编文件test.s转换成目标文件test.o。
- 链接:使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。
大端和小端
数组和指针
指针常量与常量指针
指针数组和数组指针
指针函数和函数指针
参考链接:https://blog.csdn.net/gaoxiaowei/article/details/2814295
函数
C 语言编程基础——高级
文件读写
进程与线程
数据结构与算法
数据结构
算法
1.如何衡量一个算法的好坏
算法的好坏取决于两个维度,一个是时间效率,即时间复杂度,另一个是空间效率,即空间复杂度。
- 时间复杂度:算法中的基本操作的执行次数,为算法的时间复杂度。
- 空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。
时间复杂度的计算:因为在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,一个算法执行所耗费的时间,需要你的程序放在机器上跑起来,才能够知道。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度
参考链接:https://blog.csdn.net/qq_49613557/article/details/115301174
linux 基本操作