现在的位置: 首页 > 综合 > 正文

一道BT的面试题之我见

2019年06月10日 ⁄ 综合 ⁄ 共 2070字 ⁄ 字号 评论关闭

    前几天在论坛上看到了一道面试题!挺怪的,确实是挺怪的,不过各个公司的面试题,都是挺怪的。

 

    题目如下:在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





    到此为止,这个问题,我认为我基本上都讲解清楚了,关键之处,我也用红笔勾出了!希望大




家和我交流! 


抱歉!评论已关闭.