static
1、局部变量
普通变量存储于进程栈空间,静态变量在全局数据区分配内存空间,编译器自动对齐初始化,其作用域为局部作用域,当它函数结束时作用域随之结束。在程序运行期间都不会释放,指两次调用函数时,第二次调用开始时,变量能够保持上一次调用结束时的值,局部变量的问题在于当函数退出时其生命周期结束,而利用static修饰的局部变量却可以延长其生命周期,被static修饰的变量、函数只能被同一文件内的代码段访问,限定作用范围
2、全局变量
加上static关键字能避免不同文件同名变量的冲突,且不会误使用
3、函数
不同文件可以使用相同名字的静态函数
非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明
面向对象
静态数据成员
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性
可以实现信息隐藏,静态数据成员可以是private成员,而全局变量不能
静态成员函数
静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函静态数,它只能调用其余的静态成员函数
出现在类体外的函数定义不能指定关键字static
非静态成员函数可以任意的访问静态成员函数和静态数据成员
volatile
它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它,要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据
分配内存
动态分配
动态分配的空间大小可以按需要分配,并且可以回收
常见动态内存错误
1、对NULL指针进行解引用操作
2、对分配的内存进行操作时越过边界
3、释放并非动态分配的内存
4、试图释放一块动态分配的内存的一部分以及一块内存被释放后仍被继续使用
说明
1、动态分配最常见的错误就是忘记检查所请求内存是否成功分配
2、动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界
3、当你使用free时,可能出现各种不同的错误
1>传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针
2>传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或终止
3>试图释放一块动态分配内存的一部分也有可能引起类似问题
静态分配
静态是不可以回收的