HM058 空指针安检

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
通过率
?
上传者