1. windows是什么类型的系统(实时还是分时)?有什么区别?

    分时操作系统。如果在单核的情况下,分时操作系统多个进程共用一个单核,该单核会将其执行时间分成相应的时间片,每个进程占用一定的时间片,时间片过后则跳转至下一个进程的时间片。而实时操作系统如果在单核的情况下,一个进程能独享该单核。

  2. 描述每种结构体(struct、enum、union)的区别?

    struct变量依次存储,且结构体大小为内部最大成员的整数倍,不足需要补齐(内存对齐,具体内容可参照:https://blog.csdn.net/u011573853/article/details/49967923。
    union变量每次只有一个成员存放于某个地址。联合体大小为内部最大成员的大小。
    enum大小为int数据类型的大小。将一个字符串和一个整型值联系起来。

  3. 数组和指针的区别?多维指针和多维数组的区别?多维指针可以直接操作多维数组吗?

    • 数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址

    • 数组名代表了一个指向数组首元素的指针常量,一经定义不可更改,数组名类型与数组元素类型相同;指针是指针变量,定义后仍可以更改,其类型在定义时确定

    • 当出现sizeof和&操作符时,数组名不再当成指向一个元素的指针常量使用,而指针仍可当成指向一个元素的指针变量

  4. 堆栈溢出一般什么原因

    • 函数调用层次太深。
    • 动态申请的空间使用之后没有释放。
    • 数组访问越界。
    • 指针非法访问。
  5. 计算机中是如何存储小数的?

    采用科学计数法存储

  6. C中函数是如何入栈的?

    从右往左的入栈顺序,最后压入函数名

  7. 进程和线程有什么区别?

    • 根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元

    • 进程中包含了线程,线程属于进程

    • 进程的创建、销毁和切换开销都远大于线程

    • 每个进程都有自己的内存和资源,一个进程中的线程会共享这些内存和资源

    • 子进程无法影响父进程,而子线程可以影响父线程,如主线程发生异常会影响所在进程和子线程

    • 进程CPU利用率较低,因为上下文切换开销较大,线程CPU利用率较高,上下文切换速度快

    • 进程的操纵者一般是操作系统,线程的操纵者一般是编程人员

  8. exe、lib、dll的区别?它们的关系是什么?

    具体参照:https://blog.csdn.net/kason2011/article/details/7467372

    • lib 是编译时需要的文件,dll是让动态链接的程序所需的。lib文件是在编译期连接到应用程序的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。

    • 如果只有lib文件,那么这个lib文件时静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装的时候就不需要挂载动态库dll。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

    • 在动态库的情况下,有两个文件,一个是引入库lib文件,一个是dll文件,引入库文件包含被dll文件导出的函数的名称和位置,dll文件包含实际的函数和数据,应用程序使用lib文件链接到所需要使用的dll文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是dll文件中所要调用的函数的内存地址,这样当一个或多个应用程序运行是把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,dll文件和lib文件必须随应用程序一起发行,否则应用程序将会产生错误。

    • exe文件是Windows平台下的应用程序,exe可以只需要dll文件,而不必有lib和dll头文件。

  9. 详细描述编译连接的过程

    源代码->预编译->编译->链接->可执行文件->执行

  10. 使用malloc申请200字节,调用free后,操作系统是如何知道需要释放200个字节的?

    因为malloc时会多申请4个字节,用于标记申请了多少个字节。

    长度标记 | 申请的内存空间|

    4 | 200 |

    而返回的仅仅只是申请的内存空间的地址。

  11. memcpy有什么问题?该如何解决?

    内存重叠。使用memmove或者手写处理。

  12. 完备功能的函数

    即要处理输入参数(使用if过滤),不能让程序崩溃。

  13. 判断当前编译环境是32位还是64位。

    • 方式一:使用关键字sizeof(int*)

    • 方式二:使用int**(二级指针)的偏移来确定,int**的偏移量是int*的字节大小。