Visual C++ 中的数组大小

Posted

技术标签:

【中文标题】Visual C++ 中的数组大小【英文标题】:Array size in Visual C++ 【发布时间】:2014-10-12 09:46:45 【问题描述】:

使用 Visual Studio 2012,如果我输入以下内容:

char bytes[ 2*1024*1024*1024 ]; 

我收到错误:“矩阵大小必须大于零”。如果我动态声明大小,也会发生同样的情况,即:

char* bytes = new char[ 2*1024*1024*1024 ];

如果我删除第一个“2”,一切都很好。似乎我可以从堆栈或堆请求的内存量有一个硬性限制,这个限制是 1 GB。但是,鉴于 size_t 在最坏的情况下是 4 个字节(几乎可以肯定是 8 个字节),因此索引无法处理数组的所有空间没有任何问题。是不是默认对栈和堆的限制是 1MB 的问题? (http://msdn.microsoft.com/en-us/library/f90ybzkh(v=vs.110).aspx)。如果是这样,那我为什么要分配 1 GB?

【问题讨论】:

您在大小表达式中超出了 int 的大小。 VC++ 不报告“矩阵大小必须是...”。它报告,“负下标”或“数组的大小必须大于零” @Ajay 好吧,你可能是对的。我正在使用西班牙语的 Visual Studio,我只是对编译器消息进行了直译。不过,Visual Studio 中的翻译可能不准确。抱歉,如果这造成混乱。 【参考方案1】:

您需要注意不要溢出 32 位 int 表达式 - 2*1024*1024*10242^31,它比 INT_MAX 大 1。试试:

char bytes[ 2ULL*1024*1024*1024 ];

请注意,编译错误与堆栈或堆大小无关。是否可以实际分配这么多内存是一个单独的问题。

【讨论】:

1. “这是”还是“这已经”? 2. 值得一提的是不能在32位系统上执行(需要64位地址空间)。 @barakmanos:这是 Windows 特有的限制吗?大多数合理的 32 位环境允许分配 > 2 GB。 好吧,我的意思是>4GB...在这种情况下,2GB 确实在 32 位系统上受支持,我的错误(你的 ULL 让我认为它大于 4GB,所以我没有费心做数学)。 但我认为它仍然与堆栈/堆大小有很大关系。也许您的意思是标准没有说明数组的分配位置。所以理论上这个说法是正确的。但实际上,数组将分配在堆栈、数据部分或堆中。如果那里没有“足够的空间”,那么程序将无法正确执行(或根本不会执行)。 你说得对,它是size_t,但表达式中没有隐式转换,所以就好像你写了例如size_t size = 2*1024*1024*1024;,即在表达式的值转换为size_t之前已经造成了损害。

以上是关于Visual C++ 中的数组大小的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 检查进程内存中的对象实例大小[关闭]

使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小出错。如何规避这个问题?

访问 Matrix 类 (C++) 中的二维数组 (Visual Studio 2010)

Visual C++ 6.0 中“无符号字符”数组的最大允许大小是多少?

Visual C++ 中的缩放/缩放 CWnd 控件

Visual Studio C++ 位域结构体大小问题