前几天在论坛上看到了一道面试题!挺怪的,确实是挺怪的,不过各个公司的面试题,都是挺怪的。
题目如下:在VC 6.0中定义一个数组a[1024][1024],能够运行吗?
你自己先想想他能运行吗?自己想想它到底能不能运行呢?
看到题目大多数人的反映都是这样的:我从来没有定义过这么大的数组,不知道能不能行。其
实,我们在平时也没有定义过这么大的数组,也很少这样做的。但是既然是面试题,不做也不行。
现在我们来进行全面的讨论一下!到底它能不能行呢?
自己写个小程序测试一下吧!
/////////////////////////////////////////////////////////////////////////
//FileName:test.cpp
//Date:9/29/2010
//Description:To test the array a[1024][1024] is right or wrong!
/////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
void main()
{
int a[1024][1024] = {0};
cout<<a[1023][1023]<<endl;
}
我们可以看到,在程序编译时是没有错误的。但是在程序运行时就会出错了!
说明程序是错的。现在我们再改变一下程序。
/////////////////////////////////////////////////////////////////////////
//FileName:test.cpp
//Date:9/29/2010
//Description:To test the array a[1024][1024] is right or wrong!
/////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
int a[1024][1024] = {0}; //定义一个全局数组
void main()
{
cout<<a[1023][1023]<<endl;
}
我们可以看到我刚刚在main()函数中定义的局部数组变量改成了全局数组变量。
但是程序的运行时没有错的。
那现在我再把程序改一下。代码如下:
/////////////////////////////////////////////////////////////////////////
//FileName:test.cpp
//Date:9/29/2010
//Description:To test the array a[1024][1024] is right or wrong!
/////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
void main()
{
static int a[1024][1024] = {0};
cout<<a[1023][1023]<<endl;
}
发现程序还是正常的运行,这到底是为什么呢?第一次是局部数组变量,第二次是全局数组变量,
第三次是静态数组变量。第一次是错的,后两次是正确的!
在这里可能有一个东西有的人可能不懂!那就是
VC 的栈大小默认是 1M
,但是我们定义的数组大
小是多大呢?自己算算是多少,看看你能搞清楚这里的的运算关系吗?一个int变量占4个字节,1KB
= 1024B;1M = 1024KB;很显然这个超出了1M的空间的大小了!
同时要搞清楚这个问题,你还要搞清楚了,局部变量的空间和全局变量和静态变量的空间开辟
都是在内存上开辟的,但是局部变量是在栈上开辟,全局变量和静态变量是在静态存储区存储的,
由new动态开辟的空间是在堆上。在这里就可以看出,程序的出错的真正原因了。
既然发现了问题,知道了问题错误的真正的原因,现在我们就要写出解决问题的方法。
方法一:将定义局部数组改成全局数组变量。
方法二:将定义局部数组改成静态数组变量。
方法三:改变设置。
方法三的具体实现方法如下:
打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然
后在Reserve中设定堆栈的最大值和commit。
如果对于C++的内存在程序中的分配有疑问可以去我的另一篇博文中去看,是主讲C++的内存分
配的。
http://blog.csdn.net/vipygd/archive/2010/03/05/5349153.aspx
到此为止,这个问题,我认为我基本上都讲解清楚了,关键之处,我也用红笔勾出了!希望大
家和我交流!