不解!(一个面试题)

时间:2022-09-06 13:25:46
int i,j,k;
int a[100][200][60];

for(i=0;i<60;i++)
   for(j=0;j<200;j++)
       for(k=0;k<100;k++)
           a[k][j][i]=0;
有问题吗?

55 个解决方案

#1


没有什么大问题,就是顺序有点不对啊

#2


缺少
main
其他没什么问题。

#3


还有长度最好定义成宏或者常量吧

#4


除了顺序不符合习惯,没其他问题。
不过,很多时候,不符号习惯就是很大的问题了。

#5


这个应该不只是习惯的问题,还要考虑到执行效率的问题。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。

#6


#include <iostream.h>

void main()
{
int i,j,k;
int a[100][200][60];

for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=0;

cout<<a[1][1][1];
}


调试一下,不通过啊!

#7


设置为空,可以考虑这样
int a[100][200][60];

memset(a,0,100*200*60);

#8


我的理解
没什么问题哦

#9


为什么不通过?

#10


对数组内存的分配是否有限制啊?

#11


有问提,不要这么使用,这个空间太大了有1M多。改成申请一个100*200*60的内存。原因自己想吧!

#12


刚才居然说错了。不是1M而是4M(通常int是32位)。

#13


谁能详细说明一下内存分配规则
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同

#14


在栈上开辟的内存不是最大为2M么

#15


对于循环嵌套,应该把循环次数越多的放在越内层,可以减少cpu跨切循环层的次数。所以用60-100-200比较有效率,对不?

#16


栈的空间毕竟有限, 这是根本, 比内存泄露更厉害


ugg(逸学堂(exuetang.net)) ( ) 信誉:100  2006-05-10 11:11:00  得分: 0  
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);

纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
  
 

#17


memset(a, 0, 100 * 200 * 60 * sizeof(int));
可以用
memset(a, 0, sizeof(a));

#18


数组的自动设置空间最大1M,降到1M下就没问题了,或者手动分配空间

#19


for(i=0;i<60;i++)
   for(j=0;j<200;j++)
       for(k=0;k<100;k++)
           a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
  for(k=0;k<100;k++)
    for(j=0;j<200;j++)
      a[k][j][i]=0;

#20


为了效率,最好将最大的一维先做

#21


vc6+sp6 运行出错!

#22


VC 7下运行报错,应该是内存不够引起的吧
用 new 在堆上应该就没有问题了吧

#23


使用一下动态分配内存出错:
#include <iostream> 
using namespace std;

void main() 

 int *b;
 int *a=new int(200*100*6);
 b=a;
 for(int i=0;i<200;++i)
    for (int j=0;j<100;++j)
        for (int k=0;i<6;++k)
{
                            *b=0;
 b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.

#24


是new int[200*100*6]吧?

#25


改了,但是结果还是出现这种运行错误Unhandled exception at 0x00411d35 in csdn3.exe: 0xC0000005: Access violation writing location 0x00497000.

#26


大问题没有 
循环顺序不对

#27


mark

#28


我在VC++中试了下,编译连接都没问题,结果执行时出错  ,拿来调试 :stack overflow!
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵

#29


不要超过64K,除非改变!

#30


project -> setting -> link -> output : reserve可以修改栈的大小。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。

#31


乱..

#32


是占用内存太大 了

#33


这个问题不是很难啦,把a[100][200][60],设成全局变量,问题就解决了:)
#include<stdio.h>
int a[100][200][60];

int main()
{
    int i,j,k;
    
for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}

#34


运行时会出错

#35


bbflyer的做法是正确的。
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];

int main()
{
    int i,j,k,m,n,x;
    
for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;

cout<<"answer is :"<<a[m][n][x];


while(1) ;
}

#36


栈上面空间不够,改成全局变量,该数组就放在了静态数据区,就没有大小限制了。

#37


设成全局就是把变量放到bss段里面而不是作为局部变量放在栈里面
原因上面许多人说过了。

#38


执行效率

#39


内存分配应该有问题,各向量的值该小,小到一定程度可运行VC6.0,可能内存分配不足

#40


代码段是没有问题的,没有什么文法错误。
问题在于考官想要考你什么;
由楼上诸位言语中总结一下 
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组

#41


dev c++4.9 + xp
贬意通过,但程序不能运行

#42


int a[100][200][60];
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。

对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000

#43


高手进来指点

#44


这个主要是存在效率的问题:
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];

for(i=0;i<60;i++)
   for(j=0;j<200;j++)
       for(k=0;k<100;k++)
           a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
 for(k=0;k<100;k++)
    for(j=0;j<200;j++)
           a[k][j][i]=0;

#45


改为:
for(i=0;i<60;i++)
 for(k=0;k<100;k++)
    for(j=0;j<200;j++)
           a[k][j][i]=0;
同意。。。。

#46


定义成 static 或者全局变量就应该OK,动态分配不知道有没有人试过

#47


Mark~

#48


数组变量都是放在栈里的,按默认的话栈溢出,就是这个问题

#49


vs2005中怎么找不到project settings 中的output选项?

#50


mark

#1


没有什么大问题,就是顺序有点不对啊

#2


缺少
main
其他没什么问题。

#3


还有长度最好定义成宏或者常量吧

#4


除了顺序不符合习惯,没其他问题。
不过,很多时候,不符号习惯就是很大的问题了。

#5


这个应该不只是习惯的问题,还要考虑到执行效率的问题。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。

#6


#include <iostream.h>

void main()
{
int i,j,k;
int a[100][200][60];

for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=0;

cout<<a[1][1][1];
}


调试一下,不通过啊!

#7


设置为空,可以考虑这样
int a[100][200][60];

memset(a,0,100*200*60);

#8


我的理解
没什么问题哦

#9


为什么不通过?

#10


对数组内存的分配是否有限制啊?

#11


有问提,不要这么使用,这个空间太大了有1M多。改成申请一个100*200*60的内存。原因自己想吧!

#12


刚才居然说错了。不是1M而是4M(通常int是32位)。

#13


谁能详细说明一下内存分配规则
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同

#14


在栈上开辟的内存不是最大为2M么

#15


对于循环嵌套,应该把循环次数越多的放在越内层,可以减少cpu跨切循环层的次数。所以用60-100-200比较有效率,对不?

#16


栈的空间毕竟有限, 这是根本, 比内存泄露更厉害


ugg(逸学堂(exuetang.net)) ( ) 信誉:100  2006-05-10 11:11:00  得分: 0  
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);

纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
  
 

#17


memset(a, 0, 100 * 200 * 60 * sizeof(int));
可以用
memset(a, 0, sizeof(a));

#18


数组的自动设置空间最大1M,降到1M下就没问题了,或者手动分配空间

#19


for(i=0;i<60;i++)
   for(j=0;j<200;j++)
       for(k=0;k<100;k++)
           a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
  for(k=0;k<100;k++)
    for(j=0;j<200;j++)
      a[k][j][i]=0;

#20


为了效率,最好将最大的一维先做

#21


vc6+sp6 运行出错!

#22


VC 7下运行报错,应该是内存不够引起的吧
用 new 在堆上应该就没有问题了吧

#23


使用一下动态分配内存出错:
#include <iostream> 
using namespace std;

void main() 

 int *b;
 int *a=new int(200*100*6);
 b=a;
 for(int i=0;i<200;++i)
    for (int j=0;j<100;++j)
        for (int k=0;i<6;++k)
{
                            *b=0;
 b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.

#24


是new int[200*100*6]吧?

#25


改了,但是结果还是出现这种运行错误Unhandled exception at 0x00411d35 in csdn3.exe: 0xC0000005: Access violation writing location 0x00497000.

#26


大问题没有 
循环顺序不对

#27


mark

#28


我在VC++中试了下,编译连接都没问题,结果执行时出错  ,拿来调试 :stack overflow!
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵

#29


不要超过64K,除非改变!

#30


project -> setting -> link -> output : reserve可以修改栈的大小。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。

#31


乱..

#32


是占用内存太大 了

#33


这个问题不是很难啦,把a[100][200][60],设成全局变量,问题就解决了:)
#include<stdio.h>
int a[100][200][60];

int main()
{
    int i,j,k;
    
for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}

#34


运行时会出错

#35


bbflyer的做法是正确的。
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];

int main()
{
    int i,j,k,m,n,x;
    
for(k=0;k<100;k++)

for(j=0;j<200;j++)

for(i=0;i<60;i++)

a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;

cout<<"answer is :"<<a[m][n][x];


while(1) ;
}

#36


栈上面空间不够,改成全局变量,该数组就放在了静态数据区,就没有大小限制了。

#37


设成全局就是把变量放到bss段里面而不是作为局部变量放在栈里面
原因上面许多人说过了。

#38


执行效率

#39


内存分配应该有问题,各向量的值该小,小到一定程度可运行VC6.0,可能内存分配不足

#40


代码段是没有问题的,没有什么文法错误。
问题在于考官想要考你什么;
由楼上诸位言语中总结一下 
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组

#41


dev c++4.9 + xp
贬意通过,但程序不能运行

#42


int a[100][200][60];
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。

对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000

#43


高手进来指点

#44


这个主要是存在效率的问题:
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];

for(i=0;i<60;i++)
   for(j=0;j<200;j++)
       for(k=0;k<100;k++)
           a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
 for(k=0;k<100;k++)
    for(j=0;j<200;j++)
           a[k][j][i]=0;

#45


改为:
for(i=0;i<60;i++)
 for(k=0;k<100;k++)
    for(j=0;j<200;j++)
           a[k][j][i]=0;
同意。。。。

#46


定义成 static 或者全局变量就应该OK,动态分配不知道有没有人试过

#47


Mark~

#48


数组变量都是放在栈里的,按默认的话栈溢出,就是这个问题

#49


vs2005中怎么找不到project settings 中的output选项?

#50


mark