C语言复习总结篇(二)
2017-07-30 15:09
246 查看
1、栈stack
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动(向低地址扩展的数据结构,是一块连续的内存区域);栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
VS里默认栈大小为1M,在“项目”选项可修改其大小
2、队列queue
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
3、堆heap
由程序员自己管理的内存空间,用malloc等内存分配函数获取内存即是从堆中分配内存。从堆中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话(实现这一项功能的系统很少)那就一直被占用。如果一直申请堆内存,而不释放,内存会越来越少(内存泄漏),很明显的结果是系统变慢或者申请不到新的堆内存。而过度的申请堆内存(可以试试在函数中申请一个1G的数组!),会导致堆被压爆,结果是灾难性的。
堆内存向高地址扩展,是不连续的内存区域。
4、如何动态创建二维数组?
(1)、转化为一维数组申请
(2)、先申请全部行首指针,在按行逐行申请
如图所示:
5、编译过程
6、struct、union、enum等内存对齐问题
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动(向低地址扩展的数据结构,是一块连续的内存区域);栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
VS里默认栈大小为1M,在“项目”选项可修改其大小
2、队列queue
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
3、堆heap
由程序员自己管理的内存空间,用malloc等内存分配函数获取内存即是从堆中分配内存。从堆中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话(实现这一项功能的系统很少)那就一直被占用。如果一直申请堆内存,而不释放,内存会越来越少(内存泄漏),很明显的结果是系统变慢或者申请不到新的堆内存。而过度的申请堆内存(可以试试在函数中申请一个1G的数组!),会导致堆被压爆,结果是灾难性的。
堆内存向高地址扩展,是不连续的内存区域。
4、如何动态创建二维数组?
(1)、转化为一维数组申请
typedef int (*PArr)[10]; PArr p = (PArr)malloc(n*10*sizeof(int));
(2)、先申请全部行首指针,在按行逐行申请
int main() { int line = 10; int row = 10; int **p = NULL; p = (int**)malloc(sizeof(int*)*row); assert(p != NULL); for(int i = 0;i <row;i++) { *(p+i) = (int *)malloc(sizeof(int)*line); assert((p+i)!= NULL); } . . . for(i = 0;i<row;i++) { free(*(p+i)); } free (p); p = NULL; }
如图所示:
5、编译过程
6、struct、union、enum等内存对齐问题
struct A //位段 { int a:10; //a占10位 sizeof(A) = 4; int b:10; } 注意:位段必须为int,不能超过32位,及4个字节,且字节一定要是4的倍数
union B { char a; short b; //共用低地址 sizeof(B) = 4; int c; } union取地址,取最大的一位
enum color { red,blue,green; // sizeof(color) = 4; } (1)、变量的值默认从0开始; (2)、后面的值为前面值+1; (3)、如果有赋值,以赋值为准;
struct C { char a; //1+4 struct D // sizeof(C) = 12; { char b;//1+4 int c;//4 }e }; **内存对齐时与单个数据类型中的变量类型大小对齐**
struct E { char a; struct // sizeof(E) = 12; { char b; int c; } // 如果没有变量名,没有类型名,会生成透明变量 };
struct F { char a; struct FF // sizeof(F) = 1; { char b; int c; } // 有类型名,没定义变量,就不占内存 };
#pragma pack(1) //与1对齐(取消内存对齐) struct A { char a; int b; //sizeof(A) = 5; }
相关文章推荐
- C语言复习笔记三:三种程序结构记习题总结(1)
- C语言复习总结
- 【C语言复习(二十四)】C语言程序内存结构总结
- C语言复习总结(3)
- C语言复习总结
- c语言第11章至第13章复习总结
- C语言整数类型及printf格式化输出问题总结复习及进制转换的简单实现
- C语言 if语句的总结(2)附:用if实现加减运算复习用
- C语言 指针总结(复习)
- C语言复习总结1
- C语言复习总结2
- C语言复习总结(2)
- C语言复习总结篇(一)
- c语言,全局变量,局部变量,外部函数,内部函数,stasic和extern的复习总结
- Java复习笔记+经验总结-01 运算符 表达式 数组 流程控制语句
- 关于C语言多文件编写的一点小小总结
- C语言-06数据类型-05 总结
- C语言复习 指针和动态分配内存
- 黑马训练营--IOS基础学习总结--C语言总结4
- snprintf函数用法总结复习