HM058 空指针安检
HM058 空指针安检
来源: 第 58 集 指针-空指针
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
内存中的每一块空间都有编号,编号从 \(0\) 起向后递增。若指针变量指向编号为 \(0\) 的空间,就称它为空指针。在程序里常用 NULL(或 nullptr)来表示这个 \(0\) 地址。
空指针的用途是:一开始还不知道指针该指向哪里时,先把它初始化到空处,给它一个可以写下来的值。之后一旦有了真正该指向的变量,再改指向即可。
空指针指向的内存**不可以访问**。对空指针做解引用(例如 *p 或输出 *p)会因为没有访问权限而出错。原因是编号 \(0\) 到 \(255\) 这一段内存由系统占用,用户程序既不能读也不能写。语法上这样写往往能通过编译,但运行时会失败,因此访问前必须先做合法性判断,禁止直接解引用。
现有 \(n\) 个由用户申请的整型变量,依次占用地址 \(256,257,\ldots,255+n\)。读入这些变量的值,再处理若干次地址查询:若地址是 \(0\),说明仍是空指针;若落在 \(1\) 到 \(255\),说明撞上系统区;若落在用户变量地址上,才能按该地址取出值;其余地址一律视为无效。三种非法情况都不得解引用。
输入格式
第一行一个整数 \(n\)(\(1 \le n \le 100\))。
第二行 \(n\) 个整数,依次为地址 \(256\) 到 \(255+n\) 上存放的值,每个整数的绝对值不超过 \(10^9\)。
第三行一个整数 \(q\)(\(1 \le q \le 100\))。
接下来 \(q\) 行,每行一个整数 \(addr\)(\(0 \le addr \le 10^9\)),表示一次查询的地址编号。
输出格式
共 \(q\) 行,每行一个结果:
- 若 \(addr=0\),输出
NULL; - 若 \(1 \le addr \le 255\),输出
SYSTEM; - 若 \(256 \le addr \le 255+n\),输出该地址上的整数;
- 否则输出
INVALID。
每行末尾换行。
样例
输入 #1
3
10 20 30
4
0
100
256
258
输出 #1
NULL
SYSTEM
10
30
输入 #2
1
99
2
255
257
输出 #2
SYSTEM
INVALID
说明
NULL 代表地址编号 \(0\),只能用来初始化指针,不能解引用。地址 \(100\)、\(255\) 落在系统占用的 \(0\) 到 \(255\) 内,输出 SYSTEM。样例 1 中地址 \(256\)、\(258\) 分别对应用户变量 \(10\) 和 \(30\)。样例 2 中地址 \(257\) 超出唯一的用户变量,输出 INVALID。
信息
- ID
- 1057
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者