鱼C论坛

 找回密码
 立即注册
查看: 8567|回复: 9

c语言数组下标上限问题

[复制链接]
发表于 2014-1-24 22:40:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
      在c里面定义数组,数组下标的上限是多少?不知道c标准对这个问题有没有规定?还是说根据程序在运行时有没有合适大小的连续内存,有则可以运行,没有则出错?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-1-24 22:52:33 | 显示全部楼层
本帖最后由 夏季 于 2014-1-25 09:53 编辑

C标准没有查过,不作评论。

根据malloc/new的情况看,堆中申请空间的上限是根据操作系统和编译环境(x86、x64)和剩余可用内存来定的。

注:x86可以申请的不能超过4G,实际上更小;x64的上限可以理解为操作系统剩余可用内存大小。

那么局部数组,猜测应该就是根据可分配栈的内存空间来定。另,栈的大小也是可以改的,不过一般不推荐。


// 第一份代码
  1.         const unsigned int MAX_LENGTH = 30000;

  2.         double *pData = NULL;
  3.         //pData = (double *) malloc(sizeof(double)*MAX_LENGTH);
  4.         pData = new double [Max_Length];

  5.         if( NULL == pData )                // 检验是否申请到空间
  6.         {
  7.                 printf("Need more memory\n");
  8.         }

  9.         if( NULL != pData )
  10.         {
  11.                 //free(pData);
  12.                 delete [] pData;
  13.                 pData = NULL;
  14.         }
复制代码


// 第二份代码,运行这个可以看到x86和x64在内存申请方面的区别。运行的时候可以看资源管理器的内存曲线变化
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;

  6. int main()
  7. {
  8. #if 0
  9.   
  10.   map<int, string>mapT;

  11.   cout<<mapT.max_size()<<endl;

  12.   for(size_t i = 0; i != mapT.max_size(); ++i)
  13.   {
  14.     try
  15.     {
  16.       mapT.insert(make_pair(i, string(1000, 's')));
  17.     }
  18.     catch(std::bad_alloc)
  19.     {
  20.       cout<<"\nNo enough menory to allow!\n"<<endl;
  21.       cout<<mapT.size()<<" "<<mapT.max_size()<<endl;

  22.       mapT.clear();
  23.       //return 1;
  24.     }
  25.     if( i % 10000 == 0)
  26.       cout<<i<<"    "<<mapT.size()<<endl;
  27.   }
  28.   
  29. #else

  30.   vector<string> stringSet;
  31.   cout<<stringSet.max_size();

  32.   for(size_t i = 0; i != stringSet.max_size(); ++i)
  33.   {
  34.     try
  35.     {
  36.       stringSet.push_back(string(1000, 's'));
  37.     }
  38.     catch(std::bad_alloc)
  39.     {
  40.       cout<<"\nNo enough menory to allow!\n"<<endl;
  41.       cout<<stringSet.size()<<" "<<stringSet.max_size()<<endl;

  42.       stringSet.clear();
  43.       //return 1;
  44.     }
  45.     if( i % 10000 == 0)
  46.       cout<<i<<"    "<<stringSet.size()<<endl;
  47.   }

  48. #endif

  49.   
  50.   return 0;
  51. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-24 23:18:01 | 显示全部楼层
学学 习习!!1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-24 23:18:50 | 显示全部楼层
应该是看你内存大小的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-25 00:24:17 | 显示全部楼层
来学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-25 04:20:58 | 显示全部楼层
2L说的很好,对于局部变量,都是存储在函数的栈里的,所以对于数据比较庞大的时候,建议动态申请内存空间,将数据放在堆中,而且这样可以让系统自己判断是否有足够空间分配给你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-25 10:29:46 | 显示全部楼层
very good
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-25 15:35:59 | 显示全部楼层

     谢谢大神的指导。。。运行了一下这段代码,可以把我电脑的内存几乎全部分配完,然后电脑就接近死机了。。大概知道这个应该是没有限制的了,剩余多少内存分配多少。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-25 22:00:42 | 显示全部楼层
默认好像是65535
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-1 23:55:52 | 显示全部楼层
激动人心,无法言表!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 14:38:01 | 显示全部楼层
学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 03:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表