标题:定义一个比较大的二维数组,内存溢出怎么解决,谢谢
只看楼主
huangjunxing
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2014-8-13
结帖率:50%
 问题点数:0 回复次数:12 
定义一个比较大的二维数组,内存溢出怎么解决,谢谢
Dim a1(0 To 100000, 0 To 100000) As Byte

Private Sub Form_Load()
Dim i, j As Long

For i = 0 To 100000
For j = 0 To 100000
a1(i, j) = 255
Next j
Next i

End Sub
搜索更多相关主题的帖子: 定义 比较 维数 内存 溢出 
2017-10-27 14:37
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:934
专家分:5244
注 册:2015-8-10
得分:0 
你这个应该是达到了内存分配上限。这块具体的我也不太熟悉。
你看看这个帖子2楼风版的说法
https://bbs.bccn.net/thread-359635-1-1.html
2017-10-27 16:01
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
好吧,我自己都忘了回过这个贴子。

现在看了一下,真是 班门弄斧 了...
有些地方举例还是有不合理的地方...

授人于鱼,不如授人于渔
早已停用QQ了
2017-10-27 17:32
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:934
专家分:5244
注 册:2015-8-10
得分:0 
以下是引用风吹过b在2017-10-27 17:32:14的发言:

好吧,我自己都忘了回过这个贴子。

现在看了一下,真是 班门弄斧 了...
有些地方举例还是有不合理的地方...
不要装谦虚哦
2017-10-28 16:14
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
得分:0 
在VB60中
Dim A(1 To 250000000) As Integer  '一维数组下标达到2亿5千万也没有内存溢出
Dim A(1 To 2500, 1 To 100000) As Integer    '二维数组下标是二千五百,十万时也没有内存溢出   2500 * 100000 = 250000000 2亿5千万

Dim A(1 To 300000000) As Integer  '一维数组下标达到3亿内存就溢出了
Dim A(1 To 3000, 1 To 100000) As Integer    '二维数组下标是三千,十万时就内存溢出了    3000 * 100000 = 300000000 3亿
Dim a1(0 To 100000, 0 To 100000) As Byte   '二维数组下标都是十万时当然更要内存溢出了     100000 * 100000 = 10000000000    '一百亿
好像是二维数组二个下标的乘积,不能大于二亿五千万,不知道是不是,没有详细测试,仅仅供大家探讨。

那么是不是可以这样理解,不论几维数组,其维数的积必须在负2亿5千万至正2亿5千万之间,希望大家能够积极讨论。

请不要选我!!!
2017-10-28 19:12
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
得分:0 
今天又测试了一下:
1、Dim A(1 To 266895344) As Integer   2亿6千6百8十9万5千3百4十4,不会溢出,
   而 Dim A(1 To 266895345) As Integer  2亿6千6百8十9万5千3百4十5,就溢出了
2、Dim A(1 To 16337, 1 To 16336) As Integer   266895344的开平方数,组成二维数组  16337 * 16336 = 266881232 < 266895344 不会溢出
   而  Dim A(1 To 16337, 1 To 16337) As Integer 组成的二维数组   16337 * 16337 = 266897569 > 266895344 就溢出了
3、Dim A(1 To 644, 1 TO 644 , 1 TO 643) As Integer   266895344的开三次方数,组成三维数组, 644 * 644 * 643 = 266675248 < 266895344 不会溢出
   而  Dim A(1 To 644, 1 TO 644 , 1 TO 644) As Integer  组成的三维数组 ,644 * 644 * 644 = 267089984 > 266895344 就溢出了
看来 266895344 是VB60数组的最大下标界限,不论是多少维数,维数下标的乘积必须小于 266895344 ,即 2亿6千6百8十9万5千3百4十4
是不是这样有待大家测试、验证!

请不要选我!!!
2017-10-29 08:17
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
这个数值,很困惑。

按这个值,占用内存 266895344*2+20
不是 1024 的整倍数,约512M。
20是 vb6数组的开销
integer 每个元素点2字节

回家我也测试一下。可能与电脑有关。


授人于鱼,不如授人于渔
早已停用QQ了
2017-10-29 09:32
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
定义放在 窗体全局变量 和 过程定义 、工程全局变量(使用模块定义) 三种。
第一行命令,测试如下:
1、IDE环境,报内存溢出。
2、生成EXE,运行正常。
三种结果均相同
I5 4590+8G ,WIN7 .使用第二值也相同的结果。


我认为这个内存是否溢出,与计算机的配置有关,并不是一个绝对值。

程序运行的内存数据区,分为静态区、堆,栈。
常量,一般保存在静态区,据说在VB6编译出来的程序是代码和数据交织一起的。
变量,按C里来说,数组定义,就是首地址和数据信息保存在栈里,数据保存在堆里。VB没找到相同资料。
临时变量,有范围的变量,保存在栈里,过程返回后,会被退出栈,也就是释放掉了。

数组要求是 连续的内存空间,计算机有可能找不到这么大的连续空间。内存 存在内存碎片的。






授人于鱼,不如授人于渔
早已停用QQ了
2017-10-30 10:04
booksoon
Rank: 2
等 级:论坛游民
威 望:3
帖 子:19
专家分:67
注 册:2017-10-30
得分:0 
且不说溢出不溢出,这个和计算机硬件有直接关系,但就程序中出现这么大的数组,就说明程序设计是有问题的,需要重新设计优化
2017-10-30 11:10
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
得分:0 
回复 8楼 风吹过b
很有启发,的确与计算机硬件有关系,我的是W7 系统,内存16G,在其他机子测试,这个数据又不一样。

请不要选我!!!
2017-10-31 10:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481831-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017752 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved