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*1024
是 2^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 Studio 2010) 的可变数组大小出错。如何规避这个问题?
访问 Matrix 类 (C++) 中的二维数组 (Visual Studio 2010)