HM087 new 把数据放上堆

HM087 new 把数据放上堆

HM087 new 把数据放上堆

来源: 第 87 集 程序的内存模型-内存四区-堆区

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

堆区也是程序运行之后才划分出来的。它的特点是:数据由**程序员**决定什么时候开辟、什么时候释放。程序还在跑、你又不释放,它就一直活着;整个程序结束时,系统仍会回收,不会永远占着内存。

在堆上开辟要使用关键字 newnew int(10) 会在堆里创建整数 \(10\),并返回这块内存的地址。接收这个地址必须用对应类型的指针:int *p = new int(10);new 的是 int 就返回 int *new 的是 double 就返回 double *

指针变量 \(p\) 本身仍是局部变量,在**栈**上;它保存的地址指向**堆**上的那个 \(10\)。解引用 *p 才能拿到堆里的数。

和栈区对比:若返回的是栈上局部变量的地址,多次打印第二次就会失效;堆上的数据只要程序员不释放,打印多少次都还是原来的值。本题只练习用 new 开辟,不要求在题目中途 delete(释放下一问再讲)。必须真正 new 出整数,不能只把输入原样打印。

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 100\))。

接下来 \(q\) 行,每行一个操作:

  • 1\ x:执行 new int(x),按开辟顺序分配编号 \(0,1,2,\ldots\),输出编号和该值。
  • 2\ i\ k:对编号 \(i\) 的堆数据解引用并输出 \(k\) 次(\(k \ge 1\))。保证 \(i\) 此前已由操作 \(1\) 创建。
  • 3:输出保存该地址的指针变量本身在哪一区。
  • 4:输出 new 出来的整数数据在哪一区。

\( |x| \le 10^9\)。开辟次数不超过 \(100\)。

输出格式

  • 操作 1:一行两个整数,编号和值,中间一个空格。
  • 操作 2:\(k\) 行,每行一个整数。
  • 操作 3:一行 栈区
  • 操作 4:一行 堆区

行末换行。

样例

输入 #1

4
1 10
2 0 4
3
4

输出 #1

0 10
10
10
10
10
栈区
堆区

输入 #2

3
1 7
1 8
2 1 2

输出 #2

0 7
1 8
8
8

说明

样例 1 在堆上创建 \(10\),连续解引用四次都是 \(10\),不会变成乱码。指针变量在栈区,它指向的数据在堆区。必须用 new 分配,评测结束前可以 delete 以免泄漏,但中途不要释放,否则操作 2 会读不到。

信息

ID
1086
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者