1.简述Makefile的作用
makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
2.sizeof与strlen的区别:
sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
3.什么是野指针?如何避免野指针。
野指针:指向不确定地址的指针变量。避免方法:
1.不去访问没有权限的内存(平时我们正确使用指针的时候,系统应经将相应的内存分配给用户,但是如果指向没有分配的内存,系统会判定我们没有权限)
2.不去访问已经释放了的内存
4.c语言分配内存的方式有哪些?
c语言中常见的内存错误有哪些?
分配内存:1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量。
2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,凡是分配的内存容量有限。
3、从堆上分配。也称动态内存分配。程序在运行的时候用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。动态内存的生存期有程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收他。否则运行的程序会出现内存泄漏,频繁的分配和释放不同大小的堆空间将会产生堆内碎块。
内存错误:1、指针没有指向一块合法的内存 2、为地址分配的内存太小 3、内存分配成功,但并未初始化 4、内存越界 5、内存泄漏 6、内存已经释放,但是继续通过指针来使用
5.Static全局变量与普通变量的区别?
Static局部变量与普通局部变量的区别?
static函数与普通函数的区别?
static全局变量与普通的全局变量的区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量的区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数的区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
6.#include <> 和 #include “” 有什么区别?
#include< >引用的是编译器的类库路径里面的头文件。
#include“ ”引用的是你程序目录的相对路径中的头文件。
7.char *const p; char const *p; const char p 三者的区别。
第一个和第三个是一样的, p都是指向const char类型的指针, 不可以赋值给p, 就是不可通过这个指针改变它指向的值.
第二个: char * const p是指向char的常指针, 指针需在声明时就初始化, 之后不可以改变它的指向.