HM086 栈区勿回局部地址

HM086 栈区勿回局部地址

HM086 栈区勿回局部地址

来源: 第 86 集 程序的内存模型-内存四区-栈区

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

栈区在程序运行后划分。这里的数据由**编译器自动分配和释放**,程序员不负责它的生死。一般存放两类东西:

  • 函数内部的**局部变量**;
  • 函数参数列表里的**形参**(调用时给形参开辟的内存也在栈上)。

注意事项:不要返回局部变量的地址。局部变量在栈上,函数执行完后这块内存会被自动清空。外面再用指针去解引用,属于非法操作——即使有时第一次碰巧还能读到原来的数。

按下面约定模拟(不要真的去解引用已经释放的地址,那是未定义行为):

  • 若函数返回局部变量的**值**,外面读多少次都是这个值。
  • 若函数返回局部变量的**地址**:第一次读取按编译器做了一次保留,输出原来的数;从第二次起视为已经释放,输出 released。第一次对了也不能再继续用,因为内存已经不属于你。

另外,把「局部变量 / 形参 / 其它」归类,指出谁在栈区。

输入格式

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

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

  • 1\ x\ k:函数返回局部值 \(x\),再读取 \(k\) 次(\(1 \le k \le 10\),\(|x| \le 10^9\))。
  • 2\ x\ k:函数返回局部地址(按上面的约定模拟),再读取 \(k\) 次。
  • 3\ t:分类。\(t=1\) 局部变量,\(t=2\) 形参,\(t=3\) 全局变量,\(t=4\) 堆上数据。

输出格式

操作 12:输出 \(k\) 行,每行一个整数或 released

操作 3:一行 栈区非栈区

行末换行。

样例

输入 #1

3
1 10 2
2 10 2
3 1

输出 #1

10
10
10
released
栈区

输入 #2

3
3 2
3 3
2 100 3

输出 #2

栈区
非栈区
100
released
released

说明

样例 1:返回值两次都是 \(10\);返回地址时第一次仍是 \(10\),第二次已释放。形参与局部变量都在栈区,全局变量和堆数据不是。不要在题解里真的 return &local 再二次解引用。

信息

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