结构体数组
设置分数

设置成绩,通过标志位

展示成绩 作了case

解决空间浪费 使用union,一个语法糖

同一空间不同解释,等于

共用体 and 解释方式

解释

默认 从0开始依次往下排

注意各个数据类型

如下直接取,可以防止和宏定义产生冲突


总结来讲 这玩意就是变体的前身,共用体中把所有类型全部囊括进去。


程序逻辑和数据混在一块
多轮check,并且把逻辑和数据混在一块

堆
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <tchar.h>
#include <stddef.h>
using namespace std;
int main(int argc)
{
int *p = (int *)malloc(4); //分配四字节空间 当成堆空间
*p = 999;
char *psz = (char *)malloc(20);//分配20字节空间 当成堆空间
strcpy(psz, "Hello");
char *psz2 = (char *)realloc(p, 1);//修改p所在的堆,把四字节改成一字节 新的空间首地址给到psz2
*psz2 = 'a';
p = (int *)realloc(psz2, 8);//修改psz2所在的堆,把1字节改成8字节 新的空间首地址给到p
p[0] = 0x6666;
p[1] = 0x8888;
free(p);
free(p);
system("pause");
return 0;
}

先找到大数组位置,大小4k

可以看到第一个p在里面

重新分配后仍然在p的地方

还没跑

跑完之后
p就换位置了

。
win10的堆区随机化了
我们放到winxp里面看看
第一次

仍然是一样的位置

堆基地址在win7已经开始改变了。
但其实只是基地址变了,然而分配方式,即后几位是不变的。
调试版堆
这些玩意 FEEE或者D表示空闲

未初始化的就是CD

有些附加数据

看看这十个

- 第一个 上一个堆
- 第二个 下一个堆
- 第三个 调试符号 申请代码的行
- 第四个 调试符号 申请的路径
- 第五个 申请的堆的体积
- 第六个 区分堆类型
- 第七个 堆编号
- 第八个 4个FD上溢标志 来标记越界访问的
- 第九个 堆正文
- 第十个 下溢出标志
进入这里看看

到了上一个堆

类型是一 普通堆

我们换成调试版

可以看到有信息了

如果空间不足就会做三件事

找新空间
复制源数据
释放旧空间
只有调试版才覆盖数据

发布版就会存留数据
free的封装

发布版是只有分配表 加 数据