请教高手,在线等,急!!

haidoc 2004-06-08 06:23:19
大约定义了5个static double Ez[61][61]这样的数组,编译时提示全局变量过多,这是怎么回事?我计算了一下,光要存储这些变量就需要0.45M,而tcforwin的可用内存仅有430k,请问,这样大的计算量,c不可以胜任吗?
...全文
98 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dot99 2004-06-09
  • 打赏
  • 举报
回复
对于 错误: 数组的大小不可超过0xffffffff字节
应为
单纯从sub esp, 0xffffffff上来看的话~~~溢出咯~~~
dot99 2004-06-09
  • 打赏
  • 举报
回复
给你个错误信息~~~
一、 尝试分配0xffffffff个大小的整型数组(大小为4*0xffffffff字节)
int s[0xffffffff];
错误: 数组的大小不可超过0xffffffff字节
二、减少分配数组元素为0x3ffffff个,大小为4*0x3fffffff = 0xffffffff字节
int s[0x3fffffff];
fatal error C1126: 自动分配超过 2G
三、再减少分配空间为2G
int s[0x20000000];
fatal error C1126: 自动分配超过 2G (原因是,系统还要分配一些东西保存必须的信息)
四、减少一半
int s[0x10000000];
编译通过. 但运行错误.
分配空间超过了_PAGESIZE_ 调用另外一种分配方式, 按页分配空间. VC.NET下面一页大小是0x1000.

若需要空间少于一页~
则在eax里面计算新esp, 然后xchg eax, esp
如超过一页,则循环分配内存(只是先计算新esp, 并没有实际分配)
如果需求页过多~那么堆栈就爆了~先是测试, 幸好没有写填充数~要不整个系统可能当掉
测试的时候是 test dword ptr [ecx], eax; 读取一下, 如果不可读抛出stack overflow的异常(再一次庆幸没写填充数). 如果这些页通过测试后, 则mov esp, ecx; (这里用ecx计算新esp)
如果想知道到底能自动分配多大的空间
你可以修改chkstk.asm文件, 测试页前输出log~~~~~~这样就可以得到确切大小了~~


另外, 修正一下
sub esp, xxx; 是分配xxx个字节的变量 空间~~(堆栈里面分配)

comet007 2004-06-08
  • 打赏
  • 举报
回复
什么年代了,还用tc?tc是16位的,每段64K.默认的小模式当然不行.
改用别的编译器吧,强烈建议不要在用tc了.
heuristic 2004-06-08
  • 打赏
  • 举报
回复
赞同到用的时候再定义

也可以这样:
const double Ez[61][61]
dot99 2004-06-08
  • 打赏
  • 举报
回复
建议用懒惰方法~要的时候再定义
或者分散在不同的namespace里面
一个函数里不能有那么多的变量~
因为函数里面分配局部变量的时候是这个样子
mov ebp, esp
sub esp, xxx ;分配xxx个字(变量)的空间
haidoc 2004-06-08
  • 打赏
  • 举报
回复
但是,如果不用static,怎么给数组赋值呢?
ma100 2004-06-08
  • 打赏
  • 举报
回复
当然是编译器的问题
为什么要STATIC,其实它很不好,程序大了就容易忘了,而引起问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧