大于65535的C++数组[size]引发不一致的溢出

C++ array[size] greater than 65535 throwing inconsistent overflow

本文关键字:不一致 溢出 65535 C++ 数组 大于 size      更新时间:2023-10-16

构建一个大小为[x>65535]的结构数组会抛出0xC00000FD error,即使x被声明为int64_t,但不一致。这一行行行得很好,下一行不行。

int64_t length;
length = (pull from other code);
Foo foo[length];
//^ this works
Foo2 foo2[length];
//^ this one doesn't

这是数组构造的问题吗?C++最大值?编译器/内存限制?

问题1

VLA(可变长度数组(不在标准C++中。这意味着以下是非法(即使有效(:

int length;
cin >> length;
int array[length];

问题2

什么是0xC00000FD错误代码?表示堆栈溢出异常。这意味着您超过了操作系统设置的堆栈限制。由于您使用的是windows,因此默认情况下堆栈限制为1 MB

如何修复

使用堆。

int* myArray = new int[length];
//or even better
std::vector<int> myArray;
myArray.reserve(length);

您将破坏堆栈,因为您只有一个小堆栈(我认为默认值约为1MB(,并且在堆栈上分配了VLA阵列。(65535*sizeof(int(==~256kb(256kb不是整个堆栈,但如果您分配另一个堆栈,则为512kb。这大约是堆栈的一半。添加调用帧和其他本地帧,您将很快通过大小===>堆栈溢出