鱼C论坛

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

c语言数组下标上限问题

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

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

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

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

使用道具 举报

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

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

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

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

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


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

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

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

        if( NULL != pData )
        {
                //free(pData);
                delete [] pData;
                pData = NULL;
        }

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

int main()
{
#if 0
  
  map<int, string>mapT;

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

  for(size_t i = 0; i != mapT.max_size(); ++i)
  {
    try
    {
      mapT.insert(make_pair(i, string(1000, 's')));
    }
    catch(std::bad_alloc)
    {
      cout<<"\nNo enough menory to allow!\n"<<endl;
      cout<<mapT.size()<<" "<<mapT.max_size()<<endl;

      mapT.clear();
      //return 1;
    }
    if( i % 10000 == 0)
      cout<<i<<"    "<<mapT.size()<<endl;
  }
  
#else

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

  for(size_t i = 0; i != stringSet.max_size(); ++i)
  {
    try
    {
      stringSet.push_back(string(1000, 's'));
    }
    catch(std::bad_alloc)
    {
      cout<<"\nNo enough menory to allow!\n"<<endl;
      cout<<stringSet.size()<<" "<<stringSet.max_size()<<endl;

      stringSet.clear();
      //return 1;
    }
    if( i % 10000 == 0)
      cout<<i<<"    "<<stringSet.size()<<endl;
  }

#endif

  
  return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-24 23:18:01 | 显示全部楼层
学学 习习!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-24 23:18:50 | 显示全部楼层
应该是看你内存大小的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-25 00:24:17 | 显示全部楼层
来学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2014-1-25 10:29:46 | 显示全部楼层
very good
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2014-1-25 22:00:42 | 显示全部楼层
默认好像是65535
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-1 23:55:52 | 显示全部楼层
激动人心,无法言表!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-20 14:38:01 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 01:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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