HM087 new 把数据放上堆
HM087 new 把数据放上堆
来源: 第 87 集 程序的内存模型-内存四区-堆区
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
堆区也是程序运行之后才划分出来的。它的特点是:数据由**程序员**决定什么时候开辟、什么时候释放。程序还在跑、你又不释放,它就一直活着;整个程序结束时,系统仍会回收,不会永远占着内存。
在堆上开辟要使用关键字 new。new 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
- 通过率
- ?
- 上传者