数组下标的最大值

_温水青蛙_ 2017-02-06 05:04:24

#include<stdio.h>
#include<stdlib.h>

void main()
{
int a[536870912] = { 0 };//error C2148: 数组的总大小不得超过 0x7fffffff 字节

int b[536870911] = { 0 };// fatal error C1126: 自动分配超过 2G
//已经更改程序为64位,设置了栈保留大小2G+
system("pause");
}


出现 fatal error C1126: 自动分配超过 2G的原因是什么?谢谢
...全文
674 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-02-07
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
Jiao319 2017-02-07
  • 打赏
  • 举报
回复
每个函数调用都有一个栈帧,里面存储局部变量和返回地址,栈帧大小可以由编译器设定,但不能超过系统的最大值,一般1M。要使用大的内存空间,就要用new或malloc申请堆内存。
自信男孩 2017-02-07
  • 打赏
  • 举报
回复
你这样定义数组,建议不要在嵌入式设备上运行你的程序。
_温水青蛙_ 2017-02-06
  • 打赏
  • 举报
回复
引用 2 楼 taodm 的回复:
你开这么大的数组得到是学编程呢还学折腾?
只是觉得对栈,堆,32,,64程序的一些东西还不了解,感觉和那些有关
_温水青蛙_ 2017-02-06
  • 打赏
  • 举报
回复
引用 1 楼 pengzhixi 的回复:
栈空间太小了。
通过编译器设置了栈空间为536870912*4*8+了已经,不管设置多大都会有这个问题
_温水青蛙_ 2017-02-06
  • 打赏
  • 举报
回复
引用 3 楼 u013069997 的回复:
因为栈空间是有限的,并不是无限大。如果你是用new malloc 申请的空间就可以这么大的
但是通过编译器设置了栈保留大小为536870912*4*8+了啊?
___雨落紛飛 2017-02-06
  • 打赏
  • 举报
回复
因为栈空间是有限的,并不是无限大。如果你是用new malloc 申请的空间就可以这么大的
taodm 2017-02-06
  • 打赏
  • 举报
回复
你开这么大的数组得到是学编程呢还学折腾?
pengzhixi 2017-02-06
  • 打赏
  • 举报
回复
栈空间太小了。

69,373

社区成员

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

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