#CSPS202303. 【CSP-S】-2023-结构体
【CSP-S】-2023-结构体
当前没有测试数据。
本题暂未上传测试数据,目前仅供阅读与练习。
本站练习请使用标准输入/输出;原卷中的文件名仅作原始资料参考。
题目背景
你需要模拟一种类似 C++ 的语言中的结构体定义与元素内存排布,并回答内存大小和地址查询。
题目描述
基本类型有 byte、short、int、long,分别占用 字节,其对齐要求也分别是 字节。
定义结构体类型时,需要给出类型名,以及按顺序排列的各成员的类型和名称。成员类型可以是基本类型,也可以是先前已定义的结构体类型。定义类型本身不定义具体元素、不占用内存。
定义元素时,需要给出其类型和名称。其成员按定义顺序排布;结构体成员内部递归采用相同规则。任何类型的大小,以及该类型元素的起始地址,均须是其对齐要求的整数倍。结构体的对齐要求是所有成员对齐要求的最大值,各成员取满足自身对齐要求的最小可用地址,结构体末尾再补齐到结构体对齐要求的整数倍。
例如,结构体依次包含 short a; int b; short c; 时,成员分别占据偏移地址 、、;整体对齐要求为 ,大小为 字节。
处理以下四类操作,每次操作都需要输出一个结果:
- 定义结构体类型:输出该类型的大小和对齐要求,以空格分隔。
- 定义元素:所有元素按定义顺序从地址 开始排布,并遵守对齐规则;输出新元素的起始地址。
- 访问元素:用
a.b.c形式表示逐层访问成员,输出最内层被访问元素的起始地址。 - 访问内存地址:若存在基本类型元素占据该地址,则以操作 3 的形式输出它的名称;否则输出
ERR。结构体内部用于对齐的空隙不属于基本类型元素。
输入格式
第一行一个正整数 ,表示操作数。接下来按顺序给出操作:
1 s k:定义类型名为s、包含 个成员的结构体;随后 行各给出成员类型t_i与名称n_i。2 t n:定义类型为t、名称为n的元素。3 s:访问字符串s指定的元素。4 addr:查询非负整数地址addr。
输出格式
输出 行,依次给出各操作的结果。
样例 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
数据范围
,。类型名、成员名和元素名均为长度不超过 的小写字母串,不与四种基本类型同名。
所有结构体类型名与元素名互不相同,同一结构体内的成员名互不相同;不同结构体的成员可以同名,成员名也可以与结构体类型名或元素名相同。所有操作均合法,不会引用未定义的类型、元素或成员。任意结构体大小,以及元素占据的最高地址,均不超过 。
原卷完整题面
以下保留原卷的图示、完整样例解释、分档约束和特殊性质,便于核对。原卷中引用的外部样例文件未随本次题面上传。



