【技术研究】堆-结构体数组

TEC

Posted by Corax on December 8, 2023

结构体数组

设置分数

image-20231209144800268

设置成绩,通过标志位

image-20231209144853891

展示成绩 作了case

image-20231209144729334

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

image-20231209145638442

同一空间不同解释,等于

image-20231209150040322

共用体 and 解释方式

image-20231209150425795

解释

image-20231209155430518

默认 从0开始依次往下排

image-20231209155512442

注意各个数据类型

image-20231209155709426

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

image-20231209155905727

image-20231209155915050

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

image-20231209160215882

程序逻辑和数据混在一块

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

image-20231209171134796

#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;
}

image-20231209173435457

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

image-20231209173851715

可以看到第一个p在里面

image-20231209173936038

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

image-20231209174202855

还没跑

image-20231209174827634

跑完之后

p就换位置了

image-20231209174843251

win10的堆区随机化了

我们放到winxp里面看看

第一次

image-20231209180931197

仍然是一样的位置

image-20231209181004483

堆基地址在win7已经开始改变了。

但其实只是基地址变了,然而分配方式,即后几位是不变的。

调试版堆

这些玩意 FEEE或者D表示空闲

image-20231209182111717

未初始化的就是CD

image-20231209182214596

有些附加数据

image-20231209182310765

看看这十个

image-20231209182446353

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

进入这里看看

image-20231209182817742

到了上一个堆

image-20231209182935163

类型是一 普通堆

image-20231209183347927

我们换成调试版

image-20231209183728541

可以看到有信息了

image-20231209183836439

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

image-20231209184213557

找新空间

复制源数据

释放旧空间

只有调试版才覆盖数据

image-20231209184424525

发布版就会存留数据

free的封装

image-20231209185129203

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

发布版堆