如果我键入以下内容,请使用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?
答案 0 :(得分:4)
您需要注意不要溢出32位int表达式 - 2*1024*1024*1024
是2^31
,比INT_MAX
大1。尝试:
char bytes[ 2ULL*1024*1024*1024 ];
请注意,编译错误与堆栈或堆大小无关。是否可以实际分配这么多的内存是一个单独的问题。