#CSPS202303. 【CSP-S】-2023-结构体

    ID: 345 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>CSP-S2023模拟内存对齐结构体布局字符串解析递归定位

【CSP-S】-2023-结构体

当前没有测试数据。

本题暂未上传测试数据,目前仅供阅读与练习。

本站练习请使用标准输入/输出;原卷中的文件名仅作原始资料参考。

题目背景

你需要模拟一种类似 C++ 的语言中的结构体定义与元素内存排布,并回答内存大小和地址查询。

题目描述

基本类型有 byte、short、int、long,分别占用 1,2,4,81,2,4,8 字节,其对齐要求也分别是 1,2,4,81,2,4,8 字节。

定义结构体类型时,需要给出类型名,以及按顺序排列的各成员的类型和名称。成员类型可以是基本类型,也可以是先前已定义的结构体类型。定义类型本身不定义具体元素、不占用内存。

定义元素时,需要给出其类型和名称。其成员按定义顺序排布;结构体成员内部递归采用相同规则。任何类型的大小,以及该类型元素的起始地址,均须是其对齐要求的整数倍。结构体的对齐要求是所有成员对齐要求的最大值,各成员取满足自身对齐要求的最小可用地址,结构体末尾再补齐到结构体对齐要求的整数倍。

例如,结构体依次包含 short a; int b; short c; 时,成员分别占据偏移地址 0∼10\sim1、4∼74\sim7、8∼98\sim9;整体对齐要求为 44,大小为 1212 字节。

处理以下四类操作,每次操作都需要输出一个结果:

  1. 定义结构体类型:输出该类型的大小和对齐要求,以空格分隔。
  2. 定义元素:所有元素按定义顺序从地址 00 开始排布,并遵守对齐规则;输出新元素的起始地址。
  3. 访问元素:用 a.b.c 形式表示逐层访问成员,输出最内层被访问元素的起始地址。
  4. 访问内存地址:若存在基本类型元素占据该地址,则以操作 3 的形式输出它的名称;否则输出 ERR。结构体内部用于对齐的空隙不属于基本类型元素。

输入格式

第一行一个正整数 nn,表示操作数。接下来按顺序给出操作:

  • 1 s k:定义类型名为 s、包含 kk 个成员的结构体;随后 kk 行各给出成员类型 t_i 与名称 n_i。
  • 2 t n:定义类型为 t、名称为 n 的元素。
  • 3 s:访问字符串 s 指定的元素。
  • 4 addr:查询非负整数地址 addr。

输出格式

输出 nn 行,依次给出各操作的结果。

样例 1

输入

5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10

输出

8 4
16 8
0
4
x.bb

数据范围

1≤n,k≤1001\le n,k\le100,0≤addr≤10180\le\mathrm{addr}\le10^{18}。类型名、成员名和元素名均为长度不超过 1010 的小写字母串,不与四种基本类型同名。

所有结构体类型名与元素名互不相同,同一结构体内的成员名互不相同;不同结构体的成员可以同名,成员名也可以与结构体类型名或元素名相同。所有操作均合法,不会引用未定义的类型、元素或成员。任意结构体大小,以及元素占据的最高地址,均不超过 101810^{18}。

原卷完整题面

以下保留原卷的图示、完整样例解释、分档约束和特殊性质,便于核对。原卷中引用的外部样例文件未随本次题面上传。

下载原卷题面 PDF

原卷题面第 1 页

原卷题面第 2 页

原卷题面第 3 页

原卷题面第 4 页