什么是全局变量和 main 函数中的变量
在我个人浅显的理解下, 我所认为的全局变量就是定义在函数外部, 作用于整个代码的变量类型
而定义在函数中的变量就是只作用于该函数内部的变量
这两者除此之外再无区别
当我刷了一段时间的题后~ 尤其是当我们今天看到 dp 背包问题的模板题时, 我对这两者又有了不一样的认识和感受
情形如下:
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1010;
- int main()
- {
- int n, m;
- int v[N], w[N];
- int f[N][N];
- cin>> n>> m;
- for (int i = 1; i <= n; i ++ ) cin>> v[i]>> w[i];
- for (int i = 1; i <= n; i ++ )
- for (int j = 1; j <= m; j ++ )
- {
- f[i][j] = f[i - 1][j];
- if (j>= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
- }
- cout <<f[n][m] << endl;
- return 0;
- }
这是一个再简单不过的完全背包的模板题, 当这个题在一些在线评测 oj 中都可以顺利 AC
!!
但是, 当我的这种写法在我本地的 IDE(VScode) 中运行时, 发现了无法输入然后一段时间后自动退出程序的现象
起初我一直以为是代码出错
但是后来我才明白是我对于大数组的定义出现了问题.
错误原因
我在上述代码中对于大数组的定义为内部变量
数组定义在函数中会占用 栈空间 , 而往往栈空间比较小, 所以大数组定义在函数中会出现内存方面的问题
但是如果将数组定义为全局变量 则分配在 数据段, 则不存在所谓的内存问题咯
正确的代码如下:
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1010;
- int n, m;
- int v[N], w[N];
- int f[N][N];
- int main()
- {
- cin>> n>> m;
- for (int i = 1; i <= n; i ++ ) cin>> v[i]>> w[i];
- for (int i = 1; i <= n; i ++ )
- for (int j = 1; j <= m; j ++ )
- {
- f[i][j] = f[i - 1][j];
- if (j>= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
- }
- cout << f[n][m] << endl;
- return 0;
- }
总结
我们一般不喜欢使用全局变量无非是害怕全局变量浊化变量名称, 占用更大的内存等等, 但是当大数组出现时, 我们一定要记得的将大数组定义在函数外部!
(希望我的上述总结能够为你带来一些收获, 大一菜鸡的一点点小想法, 如有思路内容不妥之处, 还望各位大佬前辈不吝赐教)
来源: http://www.bubuko.com/infodetail-3477969.html