C语言复习总结篇(二)

1、栈stack

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动(向低地址扩展的数据结构,是一块连续的内存区域);栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
VS里默认栈大小为1M,在“项目”选项可修改其大小
C语言复习总结篇(二)_第1张图片

2、队列queue

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
C语言复习总结篇(二)_第2张图片

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 int *)malloc(sizeof(int)*line);
        assert((p+i)!= NULL);
    }
    .
    .
    .
    for(i = 0;iNULL;
}

如图所示:
C语言复习总结篇(二)_第3张图片

5、编译过程
C语言复习总结篇(二)_第4张图片

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语言,c语言,数据结构)