8C程序占用内存的两个区域:堆和栈
- 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap):由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。和数据结构中的堆(二叉树)是两回事,分配方式类似于链表。
代码示例:
main()
{
int b; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); //p1 p2本身是在栈上的
p2 = (char *)malloc(20); // 分配得来得10和20字节的区域就在堆区。
}
区别列表:
- 申请后系统的响应
栈:只要栈的剩余空间大于申请空间,则分配该区域。否则报错。
堆:在空闲链表中找到足够大的区域分配。 - 申请方式
栈由系统自动分配。堆由程序员申请。 - 申请大小的限制
栈:不能超过剩余的栈空间。总的栈大小是固定的
堆:不能超过虚拟内存的大小,比较大。 - 申请效率
栈由系统自动分配,速度较快。
堆是由new分配的内存,一般速度比较慢。 - 存储内容
栈:函数调用时,进栈的依次是:下一条指令,函数从右往左的各个参数,局部变量。
堆:是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
static和const:static只声明一次,若在函数内定义则只有函数可见,在文件中定义则只有该文件可见。const即常量,不被改变。
平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
图的存储方式:邻接矩阵、邻接表(稀疏图)、十字链表(方便计算入度)、邻接多重表、边集数组
NP问题是指还未被证明是否存在多项式算法能够解决的问题,而其中NP完全问题又是最有可能不是多项式问题的问题类型。NP完全问题它可以在多项式时间内求解,当且仅当所有的其他的NP完全问题也可以在多项式时间内求解。
接口:对动作的抽象
抽象类:对根源的抽象(这个对象是什么)
抽象数据类型:一个数学模型以及定义在此数学模型上的一组操作。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样。
程序=数据结构+算法。数据结构指的是数据与数据之间的逻辑关系,算法指的是解决特定问题的步骤和方法.
红黑树:和AVL类似,都是保持树在进行插入和删除时保持树的平衡。(同时满足二叉查找树的基本要求)
指针滥用会导致内存泄露:已经分配的堆没有释放,造成内存浪费。
C++中struct和class的区别,struct的默认继承方式和默认数据权限是public,class是private。