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\) 堆上数据。
输出格式
操作 1、2:输出 \(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
- 通过率
- ?
- 上传者